EasyMock: Void Méthodes
-
21-08-2019 - |
Question
J'ai une méthode qui retourne vide dans une classe qui est une dépendance de la classe que je veux tester.
Cette classe est énorme et je suis seulement en utilisant cette méthode unique de celle-ci. Je dois remplacer la mise en œuvre de cette méthode pour le test que je veux faire quelque chose de différent et je dois être en mesure d'accéder aux paramètres de cette méthode reçoit.
Je ne peux pas trouver un moyen de le faire dans EasyMock . Je pense que je sais comment le faire avec Mockito en utilisant doAnswer
mais je ne « t voulez ajouter une autre bibliothèque, sauf si absolument nécessaire.
La solution
Si je comprends ce que vous voulez faire correctement, vous devriez pouvoir utiliser andAnswer()
:
mockObject.someMethod(eq(param1), eq(param2));
expectLastCall().andAnswer(new IAnswer() {
public Object answer() {
//supply your mock implementation here...
SomeClass arg1 = (SomeClass) getCurrentArguments()[0];
AnotherClass arg2 = (AnotherClass) getCurrentArguments()[1];
arg1.doSomething(blah);
//return the value to be returned by the method (null for void)
return null;
}
});
Le EasyMock Guide de l'utilisateur explique:
Création de valeurs de retour ou des exceptions
Parfois, nous voudrions que notre objet fantaisie pour retourner une valeur ou lancer une exception créée au moment de l'appel réel. Depuis EasyMock 2.2, l'objet retourné par et
expectLastCall()
< a href = "http://easymock.org/api/org/easymock/EasyMock.html#expect-T-" rel = "noreferrer">expect(T value)
fournit la méthodeandAnswer(IAnswer answer)
qui permet [vous] de spécifier une implémentation de l'interfaceIAnswer
qui est utilisé pour créer la valeur de retour ou d'une exception.Dans un rappel
EasyMock.getCurrentArguments()
, les arguments transmis à l'appel simulé sont disponibles via <=>. Si vous utilisez, comme les paramètres de refactoring peuvent briser vos réordonnancement tests. Vous avez été averti.
Autres conseils
Si vous appelez simplement la méthode vide pour chaque fois que vous vous attendez à être invoquée puis invoquez avant d'appeler EasyMock.expectLastCall()
replay()
, easymock se « souvenir » chaque invocation.
Je ne pense pas que vous devez appeler explicitement expect()
(autre que lastCall
) puisque vous ne rien attendre d'une méthode vide, à l'exception de son invocation.
Merci Chris!
« Amusez-vous avec EasyMock » par l'utilisateur de camarade Burt Beckwith est un bon blog qui fournit plus de détails. Extrait Notable:
Fondamentalement, le flux que je tends à utiliser est:
- Créer une maquette
- appel pour chaque appel
expect(mock.[method call]).andReturn([result])
prévu- appeler
mock.[method call]
, puis pour chaque appelreplay(mock)
vide attendu- appeler pour passer du
verify(mock)
mode « record » en mode « lecture »- injectent la maquette au besoin
- appeler la méthode d'essai
- appeler pour assurer que <=> tous les appels attendus se sont produits
Si vous ne souhaitez que l'accès aux paramètres pour plus tard, vous pouvez également apprécier le
Vous pouvez consulter PowerMock. EasyMock est basé sur l'API de réflexion proxy qui signifie que tout est un proxy et vous ne pouvez interfaces de test, et ainsi que des méthodes et des classes non finales. Cela peut fonctionner pour certains, mais si vous testez le monde tel que construit, vous aurez besoin de plus de puissance. Avec PowerMock l'API d'instrumentation Java 5 supprime les limites. Pas besoin d'écrire des implémentations simulacres d'objets de l'objet à tester (juste laid OMI). Couple PowerMock avec Mockito (ou JMockit) et vous serez vraiment hors de la course. Bien sûr, il est l'autre sens de la réécriture du code pour être plus faciles à tester, ce qui est généralement une bonne idée aussi, si possible.
Dans des situations comme celles-ci que j'ai trouvé que faire une classe imbriquée dans ma classe de test unitaire et en remplaçant les méthodes ayant des exigences particulières de cette façon est le meilleur itinéraire. Donc, si vous testez qui a ce ClassA
méthode avec les paramètres dont vous avez besoin d'accès, vous feriez quelque chose comme:
class MockClassA extends ClassA {
@Override
void specialMethod(String param1, String param2) {
// do logging or manipulation of some sort
super.specialMethod(param1,param2); // if you need to
}
}
Dans mon code de test unitaire, je puis juste utiliser cette instance à la place. Il suffit de le traiter comme si elle était tout autre objet fantaisie. Beaucoup plus facile que les bibliothèques de mélange, que je suis d'accord est probablement pas une bonne idée.