web-dev-qa-db-fra.com

comment vérifier une méthode d'un objet non-mock est appelé?

Il semble que mockito vérifie seulement si une méthode d'objet fictif est appelée et si l'objet fictif a toujours qc. comme doReturn (). when (objet fictif) ...

Mais puis-je créer un objet fictif et définir doReturn (). When (objet fictif) .. et ensuite vérifier qu'une méthode d'un autre objet est appelée?

Voici ce que je veux faire: je définis un environnement fictif et retourne une réponse, quoi qu'il arrive. Mais alors je veux vérifier que différentes méthodes de anotherObj sont appelées dans différents cas.

Comment faire ça?

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(...);
}
67
user389955

Vous pouvez utiliser un Mockito Spy pour cela. Si vous configurez anotherObj en tant qu'espion, vous pouvez vérifier les appels de méthode sur cet objet. Dans votre exemple, vous devez vous assurer que l'appel à foo utilise l'espion au lieu d'une implémentation ordinaire de anotherObj. L'espion est configuré quelque chose comme ceci:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff
verify(anotherObjSpy).codePath1(...);
91
K Erlandsson