Eu tenho um método que é chamado duas vezes e quero capturar o argumento da segunda chamada de método.
Aqui está o que eu tentei:
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()
Mas eu recebo uma TooManyActualInvocations
exceção, como Mockito acha que doSomething
deve ser chamado apenas uma vez.
Como posso verificar o argumento da segunda chamada de doSomething
?
java
unit-testing
mocking
mockito
Eric Wilson
fonte
fonte
doSomething()
em cada invocação separada com isso?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
o argumento capturado será o mesmo duas vezes (porque na verdade é o mesmo objeto de pessoa), portantocapturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
, consulte também groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) e, se necessário, faça uma verificação de tipo mais específica no argumento capturado.Desde o Mockito 2.0, também existe a possibilidade de usar o método estático Matchers.argThat (ArgumentMatcher) . Com a ajuda do Java 8, agora é muito mais limpo e mais legível escrever:
Se você está vinculado à versão Java inferior, também não é tão ruim assim:
Obviamente, nenhum deles pode verificar a ordem das chamadas - para as quais você deve usar o InOrder :
Por favor, dê uma olhada no projeto mockito-java8 que torna possível fazer chamadas como:
fonte
CharSequence
. Você conhece alguma maneira de obter o relatório para imprimir corretamente o argumento "desejado"?Se você não deseja validar todas as chamadas
doSomething()
, somente a última, basta usarArgumentCaptor.getValue()
. De acordo com o Mockito javadoc :Se o método foi chamado várias vezes, ele retornará o último valor capturado
Então, isso funcionaria (assume que
Foo
tem um métodogetName()
):fonte
Você também pode usar o ArgumentCaptor anotado no @Captor. Por exemplo:
fonte
Com os lambdas do Java 8, uma maneira conveniente é usar
fonte
Primeiro de tudo: você deve sempre importar mockito estático, assim o código será muito mais legível (e intuitivo) - os exemplos de código abaixo exigem que ele funcione:
No método confirm (), você pode passar o ArgumentCaptor para garantir a execução no teste e o ArgumentCaptor para avaliar os argumentos:
A lista de todos os argumentos passados durante o seu teste pode ser acessada pelo método argument.getAllValues ().
O valor do argumento único (última chamada) pode ser acessado via argument.getValue () para manipulação / verificação adicional ou o que você deseja fazer.
fonte