Вопрос по mocking, java, mockito, unit-testing – ложные методы в том же классе

10

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

 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. Однако, похоже, это не так.

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

Ваш Ответ

2   ответа
11

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

Другая проблема в том, что вы только заглушка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");
4

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

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

Похожие вопросы