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.

Était-ce utile?

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éthode andAnswer(IAnswer answer) qui permet [vous] de spécifier une implémentation de l'interface IAnswer 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:

     
      
  1. Créer une maquette
  2.   
  3. appel pour chaque appel expect(mock.[method call]).andReturn([result]) prévu
  4.   
  5. appeler mock.[method call], puis pour chaque appel replay(mock) vide attendu
  6.   
  7. appeler pour passer du verify(mock) mode « record » en mode « lecture »
  8.   
  9. injectent la maquette au besoin
  10.   
  11. appeler la méthode d'essai
  12.   
  13. appeler pour assurer que <=> tous les appels attendus se sont produits
  14.   

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.

scroll top