J'ai une méthode qui est appelée deux fois et je veux capturer l'argument du deuxième appel de méthode.
Voici ce que j'ai essayé:
ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class);
ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar).doSomething(firstFooCaptor.capture());
verify(mockBar).doSomething(secondFooCaptor.capture());
// then do some assertions on secondFooCaptor.getValue()
Mais je reçois une TooManyActualInvocations
exception, car Mockito pense que cela doSomething
ne devrait être appelé qu'une seule fois.
Comment puis-je vérifier l'argument du deuxième appel de doSomething
?
java
unit-testing
mocking
mockito
Eric Wilson
la source
la source
doSomething()
chaque appel distinct avec ceci?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
l'argument capturé sera le même deux fois (car en fait c'est le même objet personne), alorscapturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
, voir aussi groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) et, si nécessaire, effectuerez une vérification de type plus spécifique sur l'argument capturé.Depuis Mockito 2.0, il est également possible d'utiliser la méthode statique Matchers.argThat (ArgumentMatcher) . Avec l'aide de Java 8, il est maintenant beaucoup plus propre et plus lisible d'écrire:
Si vous êtes lié à une version Java inférieure, il n'y a pas non plus si mal:
Bien sûr, aucun de ceux-ci ne peut vérifier l'ordre des appels - pour lequel vous devez utiliser InOrder :
Veuillez jeter un œil au projet mockito-java8 qui permet de faire des appels tels que:
la source
CharSequence
. Connaissez-vous un moyen d'obtenir le rapport pour imprimer correctement l'argument "recherché"?Si vous ne souhaitez pas valider tous les appels
doSomething()
, uniquement le dernier, vous pouvez simplement utiliserArgumentCaptor.getValue()
. Selon le javadoc Mockito :Si la méthode a été appelée plusieurs fois, elle renvoie la dernière valeur capturée
Donc, cela fonctionnerait (suppose
Foo
une méthodegetName()
):la source
Vous pouvez également utiliser ArgumentCaptor annoté @Captor. Par exemple:
la source
Avec les lambdas de Java 8, un moyen pratique consiste à utiliser
la source
Tout d'abord: vous devez toujours importer mockito static, de cette façon le code sera beaucoup plus lisible (et intuitif) - les exemples de code ci-dessous nécessitent qu'il fonctionne:
Dans la méthode verify (), vous pouvez passer ArgumentCaptor pour assurer l'exécution dans le test et ArgumentCaptor pour évaluer les arguments:
La liste de tous les arguments passés pendant votre test est accessible via la méthode argument.getAllValues ().
La valeur de l'argument unique (dernier appelé) est accessible via l'argument.getValue () pour une manipulation / vérification supplémentaire ou tout ce que vous souhaitez faire.
la source