¿Cuáles son las diferencias entre @Mocked, @Injectable y @Capturing?

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 Robotcuenta 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/ @Capturinges posible y no puede ser sustituido por otro?

LppEdd:
  • @Injectableburla 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.
  • @Capturinges básicamente el mismo que @Mocked, pero se extiende burla a cada subtipo del tipo anotado (conveniente!).

Otra diferencia de @Injectablees que sólo los campos marcados con esta anotación se consideran para la inyección en el interior @Testedde los casos.

La diferencia debe ser bastante claro ahora.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=205036&siteId=1
Recomendado
Clasificación