как проверить вызывается метод немодового объекта?

103

Кажется, что mockito только проверяет, вызывается ли метод фиктивного объекта, а у фиктивного объекта всегда есть что-то вроде doReturn().when(mock object)

Но могу ли я создать фиктивный объект и определить, doReturn().when(mock object) а затем проверить, что вызывается метод другого объекта?

Вот что я хочу сделать: я определяю mockEnvironment и возвращаю ответ, что бы ни случилось. Но затем я хочу проверить, что разные методы вызываются в разных случаях.

Как это сделать?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}
user389955
источник

Ответы:

121

Вы можете использовать для этого Mockito Spy . Если вы настроены anotherObjкак шпион, вы можете проверить вызовы методов для этого объекта. В вашем примере вам нужно убедиться, что при вызове fooиспользуется шпион вместо обычной реализации anotherObj. Шпион настраивается примерно так:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
К. Эрландссон
источник
Это означает, что мне может потребоваться создать и внедрить несколько имитируемых объектов, если я хочу проверить несколько вещей? это не удобно.
user389955
@ user389955 да, вам нужно настроить каждый объект, который вы хотите проверить, как шпион. Насколько я знаю, этого нет. Mockito необходимо добавить прокси к объектам, и кто-то должен сообщить Mockito, какие объекты прокси.
К Эрландссон,
10
Вместо того, чтобы говорить «// делать что-нибудь», может быть полезно добавить, что именно «anotherObjSpy» должен вызывать тестируемый вызов метода.
jwehrle
Спасибо @jwehrle, вам нужно использовать anotherObjSpy в вызовах, иначе тесты не будут работать.
argoth
2

Добавьте аннотацию к не фиктивному объекту, @Spyа затем проверьте наличие verify(). Проверить это

CodeHunter
источник