it-swarm.com.ru

ложные методы в том же классе

Я использую Mockito, чтобы смоделировать метод в том же классе, для которого я пишу тест. Я видел другие ответы о SO ( метод Mocking в том же классе ), но, вероятно, я их неправильно понимаю, так как столкнулся с проблемами.

 class Temp() {

    public boolean methodA(String param) {

         try {

             if(methodB(param))
                   return true;

             return false;
         } catch (Exception e) {
               e.printStackTrace();
         }
    }
 }

Мой метод испытаний:

 @Test
 public void testMethodA() {

    Temp temp = new Temp();
    Temp spyTemp = Mockito.spy(temp);

    Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
    boolean status = temp.methodA("XYZ");

    Assert.assertEquals(true, status);
 }

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

Может кто-нибудь объяснить, где я иду не так?

9
learningMyWayThru

Первая проблема заключается в том, что вы должны использовать объект spyTest, чтобы ожидать чего-то от Mockito. Здесь это не то же самое, что тест. spyTemp является обернутым объектом Mockito temp

Другая проблема заключается в том, что вы заглушаете только methodB(), но пытаетесь запустить methodA(). Да, в вашей реализации methodA() вы вызываете methodB (), но вы вызываете в this.methodB(), а не как spyTemp.methodB(). Здесь вы должны понимать, что насмешка будет работать только тогда, когда вы вызываете ее в экземпляре temp. Он обернут прокси-сервером Mockito, который перехватывает ваш вызов, и если вы переопределите какой-либо метод, он вызовет вашу новую реализацию вместо оригинальной. Но поскольку оригинальный метод вызывается, внутри него вы ничего не знаете о прокси-сервере Mockito. Таким образом, ваш переопределенный метод будет вызываться только при запуске spyTemp.methodB()

Это должно работать:

Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
boolean status = spyTemp.methodB("XYZ");
11
Konstantin Labun

Вы создали шпион и высмеяли methodB(). Это правильно! Но вы вызвали methodA() для исходного объекта. Чтобы получить правильный результат, позвоните в шпион

boolean status = spyTemp.methodA("XYZ");
4
CoronA

Обратите внимание на следующее из документации Mockito:

Вместо этого Mockito не делегирует вызовы пропущенному реальному экземпляру это на самом деле создает копию этого. Так что если вы сохраните реальный экземпляр и взаимодействовать с ним, не ожидайте, что шпион узнает об этом взаимодействие и их влияние на состояние реального экземпляра. Следствие что когда unstubbed метод вызывается для шпиона но не для Реальный экземпляр , вы не увидите никаких эффектов на реальном экземпляре.

Это относится конкретно к вашей ситуации. Вы сохраняете ссылку на temp, а затем вызываете ее methodA. Мокито вовсе не шпионит за этим случаем; он шпионит за spyTemp. Так называется нормальный methodB.

Обратите внимание, что вам следует полностью избегать частичной проверки для нового кода.

2
sprinter