EasyMock andReturn () vs andStubReturn()

Quelle est la différence entre l'utilisation de andReturn(T value) vs andStubReturn(T value) pour EasyMock?

Dans quelle situation utiliseriez-vous andStubReturn()andReturn() ne peut pas atteindre le même résultat?

52
demandé sur WW. 2010-09-18 08:23:04

2 réponses

Vous utilisez un retour stub pour un appel de méthode sur le simulacre que vous attendez mais qui ne vous intéresse pas autrement. Vous utilisez un retour régulier pour un appel de méthode "régulier".

Considérons la méthode suivante:

public void someMethod(String arg) {
    if (logger.isDebugEnabled()) {
        logger.debug("Calling doSomething() on service " 
                       + service.getName().hashCode());
    }

    service.postMessage("{" + arg + "}");

    if (logger.isDebugEnabled()) {
        logger.info("Finished calling doSomething() on service " 
                      + service.getName().hashCode());
    }
}

...où service est un champ moquable. La chose hashCode() dans les instructions de journal est artificielle, mais le fait est que votre maquette doit répondre à n'importe quel nombre d'appels à getName() pour éviter un NPE, alors que vous ne pourriez pas vous en soucier.

Lors de l'écriture d'un Test unitaire basé sur EasyMock pour cette méthode, vous andStubReturn() l'appel à getName() et utilisez un andReturn() normal pour l'appel à postMessage(String). Lorsque vous vérifiez l'objet simulé, il ne tiendra compte que de ce dernier et votre test ne se casse pas si vous modifiez la configuration log4j.

55
répondu Barend 2010-09-20 21:21:41

Une note supplémentaire pour plus de clarté.

Si vous utilisez .andStubReturn () (ou si vous utilisez .andReturn (foo).anyTimes ()), il n'y aura pas de nombre d'appels minimum attendu. Donc, si vous définissez une attente fictive en utilisant l'un de ces deux, et que la méthode moquée n'est pas appelée, le .verify () appel ne sera pas affirmer.

Exemple qui va Pas affirmer quand la méthode mocked n'est pas appelée;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);

Exemple que va affirmer lorsque la méthode mocked n'est pas appelée;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);
5
répondu Ben 2015-03-13 20:07:58