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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.