579 votes

Peut Mockito capturer des arguments d'une méthode appelée plusieurs fois?

J'ai une méthode qui est appelée deux fois, et je veux capturer l'argument de la 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 TooManyActualInvocations d'Exception, comme Mockito pense qu' doSomething ne doit être appelé qu'une seule fois.

Comment puis-je vérifier l'argument de la deuxième appel d' doSomething?

1009voto

proactif Points 1796

Je pense qu'il devrait être

verify(mockBar, times(2)).doSomething(...)

L'échantillon de mockito javadoc:

ArgumentCaptor<Person> peopleCaptor = ArgumentCaptor.forClass(Person.class);
verify(mock, times(2)).doSomething(peopleCaptor.capture());

List<Person> capturedPeople = peopleCaptor.getAllValues();
assertEquals("John", capturedPeople.get(0).getName());
assertEquals("Jane", capturedPeople.get(1).getName());

32voto

lreeder Points 4646

Si vous ne voulez pas valider tous les appels à l' doSomething(), seul le dernier, vous pouvez simplement utiliser ArgumentCaptor.getValue(). Selon le Mockito javadoc:

Si la méthode a été appelée plusieurs fois, puis il retourne la dernière valeur capturée

Donc, ce serait un travail (ce qui suppose Foo a une méthode getName()):

ArgumentCaptor<Foo> fooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar, times(2)).doSomething(fooCaptor.capture());
//getValue() contains value set in second call to doSomething()
assertEquals("2nd one", fooCaptor.getValue().getName());

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