Вложенные насмешки в Мокито - PullRequest
0 голосов
/ 29 марта 2011

У меня есть этот код Mockito:

interface Dao {
    public void doSomething();
}

class LegacyClass {
    Dao dao;

    public String legacyMethod() {
        dao.doSomething();
        return "Test";
    }
}

public class MockitoTest {
    public static void main(String[] args) {
        Dao dao = mock(Dao.class);
        LegacyClass legacyInst = new LegacyClass();
        legacyInst.dao = dao;
        LegacyClass legacy = spy(legacyInst);

        when(legacy.legacyMethod()).thenReturn("Replacement");
    }
}

Последний when() выдает следующее исключение:

Exception in thread "main" org.mockito.exceptions.base.MockitoException: 
'doSomething' is a *void method* and it *cannot* be stubbed with a *return value*!
Voids are usually stubbed with Throwables:
    doThrow(exception).when(mock).someVoidMethod();
If the method you are trying to stub is *overloaded* then make sure you are calling the right overloaded version.
    at mypkg.MockitoTest.main(MockitoTest.java:28)

Тем не менее, я НЕ дразнил возвращаемое значение для Dao.doSomething, но для LegacyClass.legacyMethod().

Это ожидаемое поведение? Есть ли документы Mockito о том, что вы не можете вкладывать подобные макеты?

Как мне обойти это?

1 Ответ

2 голосов
/ 29 марта 2011

Шпионы не работают таким образом. В вашем примере кода настоящий метод legacy.legacyMethod() фактически вызывается, потому что это шпион, а не фиктивный (который затем вызывает dao.doSomething()), поэтому вы получаете эту ошибку.

Если вы хотите сделать частичный макет, вы должны написать это как:

doReturn("Replacement").when(legacy).legacyMethod();

Таким образом, Мокито будет знать, что вы хотите создать частичную имитацию, поэтому он не вызовет реальный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...