trdngy:
En primer lugar, definir una clase, digamos Robot
.
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Clase de Robot
cuenta con varias dependencias, uno de ellos es Vision
.
public class Vision {
public Object recognize(List<List<Integer>> frames) {
// do magic stuff, but return dummy stuff
return null;
}
}
Luego, en la clase de prueba, simplemente probar el momento de la invocación de recognize()
.
@RunWith(JMockit.class)
public class RobotTest {
@Test
public void recognizeObjectWithMocked(@Mocked final Vision vision) {
List<List<Integer>> frames = new ArrayList<>();
vision.recognize(frames);
new Verifications() {{
vision.recognize((List<List<Integer>>) any);
times = 1;
}};
}
@Test
public void recognizeObjectWithInjectable(@Injectable final Vision vision) {
List<List<Integer>> frames = new ArrayList<>();
vision.recognize(frames);
new Verifications() {{
vision.recognize((List<List<Integer>>) any);
times = 1;
}};
}
@Test
public void recognizeObjectWithCapturing(@Capturing final Vision vision) {
List<List<Integer>> frames = new ArrayList<>();
vision.recognize(frames);
new Verifications() {{
vision.recognize((List<List<Integer>>) any);
times = 1;
}};
}
}
Basándose en estas pruebas, creo que estos tales 3 anotaciones se pueden utilizar indistintamente.
¿Es eso correcto?
Si la respuesta es no, entonces ¿hay algún caso que sólo
@Mocked
/@Injectable
/@Capturing
es posible y no puede ser sustituido por otro?
LppEdd:
@Injectable
burla una sola instancia (parámetro de por ejemplo, un método de ensayo). No todos los casos utiliza dentro del contexto de prueba.@Mocked
se burla de todos los métodos de clase y constructores en cada instancia creada dentro del contexto de prueba.@Capturing
es básicamente el mismo que@Mocked
, pero se extiende burla a cada subtipo del tipo anotado (conveniente!).
Otra diferencia de @Injectable
es que sólo los campos marcados con esta anotación se consideran para la inyección en el interior @Tested
de los casos.
La diferencia debe ser bastante claro ahora.