Каковы различия между @Mocked, @Injectable и @Capturing? - PullRequest
0 голосов
/ 16 февраля 2019

Сначала я определяю класс, скажем, Robot.

public class Robot {

    private Vision vision;

    public Object recognizeObject(List<List<Integer>> frames) {
        vision = new Vision();
        return vision.recognize(frames);
    }
}

Класс Robot имеет несколько зависимостей, одна из которых Vision.

public class Vision {

    public Object recognize(List<List<Integer>> frames) {
        // do magic stuff, but return dummy stuff
        return null;
    }

}

Затем в тестовом классе я просто проверяю время вызова 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;
        }};
    }
}

Основываясь на этих тестах, я думаю, что эти три таких аннотации можно использовать взаимозаменяемо.

  • Это правильно?

  • Если ответ отрицательный, то есть ли случай, что возможен только @Mocked / @Injectable / @Capturing ине может быть заменен другим?

1 Ответ

0 голосов
/ 16 февраля 2019
  • @Injectable макетирует один экземпляр (например, параметр метода тестирования).Не каждый экземпляр, используемый внутри контекста теста.
  • @Mocked будет высмеивать все методы и конструкторы класса в каждом экземпляре, созданном внутри контекста теста.
  • @Capturing в основном совпадает с @Mocked, но оно распространяется на все подтипы аннотированного типа (удобно!).

Другое отличие @Injectable состоит в том, что только поля, помеченные этой аннотацией, рассматриваются для внедрения внутри @Tested экземпляров..

Разница должна быть довольно ясной.

...