291 votes

Mockito. Vérifier les arguments de méthode

J'ai googlé sur ce sujet, mais n'ai rien trouvé de pertinent. J'ai quelque chose comme ceci:

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);

Testeable obj = new Testeable();
obj.setMockeable(mock);
command.runtestmethod();

Maintenant, je veux vérifier que mymethod(Object o), qui est appelée à l'intérieur d' runtestmethod(), a été appelé avec l'Objet o, pas un autre. Mais j'ai toujours passer le test, ce que j'ai mis sur la vérification, par exemple, avec:

Mockito.verify(mock.mymethod(Mockito.eq(obj)));

ou

Mockito.verify(mock.mymethod(Mockito.eq(null)));

ou

Mockito.verify(mock.mymethod(Mockito.eq("something_else")));

J'ai toujours passer le test. Comment puis-je réaliser cette vérification (si possible)?

Je vous remercie.

70voto

Matthew Kirkley Points 725

Essayez-vous de faire logique de l'égalité en utilisant l'objet .méthode equals? Vous pouvez le faire en utilisant le argThat matcher qui est inclus dans Mockito

import static org.mockito.Matchers.argThat

Ensuite, vous pouvez mettre en œuvre votre propre argument matcher qui s'en remettent à chacun des objets .méthode equals

private class ObjectEqualityArgumentMatcher<T> extends ArgumentMatcher<T> {
    T thisObject;

    public ObjectEqualityArgumentMatcher(T thisObject) {
        this.thisObject = thisObject;
    }

    @Override
    public boolean matches(Object argument) {
        return thisObject.equals(argument);
    }
}

Maintenant, en utilisant votre code, vous pouvez le mettre à jour à la lecture...

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj)).thenReturn(null);

Testeable obj = new Testeable();
obj.setMockeable(mock);
command.runtestmethod();

verify(mock).mymethod(argThat(new ObjectEqualityArgumentMatcher<Object>(obj)));

Si vous allez juste pour EXACTE de l'égalité (même objet en mémoire), il suffit de faire

verify(mock).mymethod(obj);

Ceci permettra de vérifier qu'il a été appelé une fois.

59voto

Bozho Points 273663
  • Vous n'avez pas besoin de l' eq matcher si vous n'utilisez pas de rapprochement.
  • Vous n'êtes pas à l'aide de la syntaxe correcte - votre appel de méthode doit être à l'extérieur de l' .verify(mock). Vous êtes maintenant en initiant une vérification sur le résultat de l'appel de méthode, sans vérifier quoi que ce soit (ne pas faire un appel de méthode). Par conséquent, tous les tests sont de passage.

Vous code devrait ressembler à:

Mockito.verify(mock).mymethod(obj);
Mockito.verify(mock).mymethod(null);
Mockito.verify(mock).mymethod("something_else");

5voto

rit Points 1279

Avez-vous vérifié la méthode equals pour la mockable classe? Si celui-ci renvoie toujours true ou de tester la même instance à l'encontre de la même instance et de l'égalité de méthode n'est pas remplacé (et à cet effet, vérifie uniquement les références), puis il retourne la valeur true.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X