comment vérifier qu'une méthode d'un objet non simulé est appelée?

100

Il semble que mockito vérifie uniquement si une méthode d'un objet fictif est appelée et que l'objet fictif a toujours quelque chose comme doReturn().when(mock object)

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

Voici ce que je veux faire: je définis un environnement simulé et je renvoie une réponse quoi qu'il arrive. Mais ensuite, je veux vérifier différentes méthodes d'un autreObj est appelé 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(...);
}
user389955
la source

Réponses:

118

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

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
K Erlandsson
la source
Cela signifie que je devrai peut-être créer et injecter plusieurs objets simulés si je veux vérifier plusieurs choses? ce n'est pas pratique.
user389955
@ user389955 oui, vous devez configurer chaque objet que vous souhaitez vérifier en tant qu'espion. Autant que je sache, il n'y a pas moyen de contourner cela. Mockito doit ajouter un proxy aux objets et quelqu'un doit indiquer à Mockito les objets à proxy.
K Erlandsson
10
Au lieu de dire "// faire des trucs", il peut être utile d'ajouter que c'est le "anotherObjSpy" qui doit faire l'appel de méthode testé.
jwehrle
Merci @jwehrle, vous devez utiliser un anotherObjSpy dans les appels, sinon les tests ne fonctionneront pas.
argoth
2

Annotez l'objet non fictif avec une @Spyannotation, puis vérifiez verify(). Vérifiez ceci

CodeHunter
la source