Я столкнулся с проблемой, издеваясь над junit test.
Сценарий такой:
Класс A реализует интерфейс из стороннего jar-файла и должен реализовать метод1. Помимо метода1, A также содержит метод2, который вызывается из метода1. Сам метод method2 вызывает некоторую внешнюю службу.
Я хочу использовать метод модульного тестирования1.
method1 принимает входные данные, скажем, X. Внутри X есть входная переменная, скажем, var1. var1 используется логикой в method1, а method1 устанавливает другую переменную, скажем, var2, в X.
Итак, я сначала издеваюсь над классом A, чтобы издеваться над методом2.
A a= Mockito.spy(new A());
doReturn("some dummy value").when(a).method2();
Затем мне также нужно смоделировать X для установки var1.
X x= mock(X.class);
when(x.getVariable("var1")).thenReturn("some dummy value for var1");
Ну наконец то:
a.method1(x);
Внутри, метод1 я делаю:
x.setVariable("var2","some value for var2").
Теперь в модульном тесте, когда я пытаюсь получить var2 из x, я получаю null.
x.getVariable("var2");
Я ожидаю «некоторое значение для var2», но вместо этого получаю ноль.
Я так думаю, но не уверен. Я думаю, что уже частично издеваюсь над А. И нужно сделать то же самое для X.
Ну, вы издевались над методом X.getVariable. Так что он возвращает только то, что вы говорите ему вернуть. И вы только сказали вернуть что-то, когда оно вызывается с «var1», а не с «var2». Таким образом, он возвращает null. Вероятно, вам не следует издеваться над X в первую очередь. Полный, минимальный пример поможет.





Вы правильно частично издеваетесь над классом A, но используете макет для класса X.
У вас нет ожиданий, установленных для x.getVariable("var2"), и поэтому он всегда возвращает ноль.
Вызов x.setVariable("var2","some value for var2"). в макете не влияет на этот вызов.
Что я предлагаю:
X x = mock(X.class);
when(x.getVariable("var2")).thenCallRealMethod();
doCallRealMethod().when(x).setVariable(anyString(), anyString());
when(x.getVariable("var1")).thenReturn("some dummy value for var1");
Кроме того, если тестируемый метод method1 не вызывает method2 в своем теле, используйте реальный экземпляр A вместо частичной имитации.
Вы ищете частичный макет?