web-dev-qa-db-fra.com

EasyMock andReturn () vs andStubReturn ()

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

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

54
Glide

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

Considérez 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 modifiable. 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 autrement à propos de ça.

Lorsque vous écrivez un test unitaire basé sur EasyMock pour cette méthode, vous devez andStubReturn() l'appel à getName() et utiliser un andReturn() normal pour l'appel à postMessage(String). Lorsque vous vérifiez l'objet simulé, il ne prend en compte que ce dernier et votre test ne se rompt pas si vous modifiez la configuration de log4j.

56
Barend

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 minimum d'appels attendus. Par conséquent, si vous définissez une attente fictive à l'aide de l'une de ces deux méthodes et que la méthode simulée n'est PAS appelée, l'appel .verify () ne sera pas confirmé.

Exemple qui PAS affirmera quand la méthode simulée 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 quand la méthode simulée 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
Ben