como verificar um método de um objeto não simulado é chamado?

100

Parece que o mockito apenas verifica se um método de um objeto simulado é chamado e o objeto simulado sempre tem algo como doReturn().when(mock object)

Mas posso criar um objeto mock e definir doReturn().when(mock object) e, em seguida, verificar se um método de outro objeto é chamado?

Aqui está o que eu quero fazer: defino um mockEnvironment e retorno uma resposta, não importa o que aconteça. Mas, então, quero verificar se diferentes métodos de outro OBJ é chamado em diferentes casos.

Como fazer isso?

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
fonte

Respostas:

118

Você pode usar um Mockito Spy para isso. Se você configurar anotherObjcomo um espião, poderá verificar chamadas de método nesse objeto. No seu exemplo, você precisa se certificar de que a chamada para foousa o espião em vez de uma implementação comum de anotherObj. O espião está configurado da seguinte forma:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
K Erlandsson
fonte
Isso significa que posso precisar criar e injetar vários objetos simulados se quiser verificar várias coisas. isso não é conveniente.
user389955
@ user389955 sim, você precisa configurar cada objeto que deseja verificar como um espião. Pelo que eu sei, não há maneira de contornar isso. O Mockito precisa adicionar um proxy aos objetos e alguém deve dizer ao Mockito quais objetos devem ser proxy.
K Erlandsson
10
Em vez de dizer "// fazer coisas", pode ser útil adicionar que é o "anotherObjSpy" que deve fazer a chamada do método que está sendo testada.
jwehrle
Obrigado @jwehrle, você precisa usar o anotherObjSpy nas chamadas, caso contrário os testes não funcionarão.
argoth
2

Anote o objeto não simulado com @Spyanotação e, em seguida, verifique verify(). Verifique isto

CodeHunter
fonte