Ich habe eine Methode, die zweimal aufgerufen wird, und ich möchte das Argument des zweiten Methodenaufrufs erfassen.
Folgendes habe ich versucht:
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()
Aber ich bekomme eine TooManyActualInvocations
Ausnahme, da Mockito meint, dass doSomething
das nur einmal aufgerufen werden sollte.
Wie kann ich das Argument des zweiten Aufrufs von überprüfen doSomething
?
java
unit-testing
mocking
mockito
Eric Wilson
quelle
quelle
doSomething()
in jedem einzelnen Aufruf übergeben wurden?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
Das erfasste Argument zweimal dasselbe ist (da es sich tatsächlich um dasselbe Personenobjekt handelt)capturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
. Siehe auch groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) verwenden und bei Bedarf eine spezifischere Typprüfung für das erfasste Argument durchführen.Seit Mockito 2.0 besteht auch die Möglichkeit, die statische Methode Matchers.argThat (ArgumentMatcher) zu verwenden . Mit Hilfe von Java 8 ist es jetzt viel sauberer und lesbarer zu schreiben:
Wenn Sie an eine niedrigere Java-Version gebunden sind, gibt es auch nichts Schlimmes:
Natürlich kann keiner von diesen die Reihenfolge der Anrufe überprüfen - für die Sie InOrder verwenden sollten :
Bitte werfen Sie einen Blick auf das mockito-java8- Projekt, mit dem Sie Anrufe tätigen können wie:
quelle
CharSequence
. Kennen Sie eine Möglichkeit, den Bericht dazu zu bringen, das "gesuchte" Argument richtig auszudrucken?Wenn Sie nicht alle Anrufe überprüfen möchten
doSomething()
, können Sie nur den letzten verwendenArgumentCaptor.getValue()
. Laut dem Mockito Javadoc :Wenn die Methode mehrmals aufgerufen wurde, wird der zuletzt erfasste Wert zurückgegeben
Das würde also funktionieren (setzt
Foo
eine Methode vorausgetName()
):quelle
Sie können auch @Captor annotated ArgumentCaptor verwenden. Zum Beispiel:
quelle
Mit den Lambdas von Java 8 ist die Verwendung bequem
quelle
Zuallererst: Sie sollten immer mockito static importieren, damit der Code viel besser lesbar (und intuitiv) ist - die folgenden Codebeispiele erfordern, dass er funktioniert:
In der verify () -Methode können Sie den ArgumentCaptor übergeben, um die Ausführung im Test sicherzustellen, und den ArgumentCaptor, um die Argumente auszuwerten:
Auf die Liste aller während Ihres Tests übergebenen Argumente kann über die argument.getAllValues () -Methode zugegriffen werden.
Auf den Wert des einzelnen (zuletzt aufgerufenen) Arguments kann über argument.getValue () zugegriffen werden, um weitere Manipulationen / Überprüfungen vorzunehmen oder was auch immer Sie tun möchten.
quelle