Eu tenho uma chamada de método que eu quero zombar com mockito. Para começar, criei e injetei uma instância de um objeto no qual o método será chamado. Meu objetivo é verificar um dos objetos na chamada de método.
Existe uma maneira de o mockito permitir afirmar ou verificar o objeto e seus atributos quando o método mock é chamado?
exemplo
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Em vez de fazer, anyObject()
quero verificar se o objeto de argumento contém alguns campos específicos
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Respostas:
O novo recurso adicionado ao Mockito torna isso ainda mais fácil,
Veja a documentação do Mockito
Caso haja mais de um parâmetro e a captura de apenas um único parâmetro seja desejada, use outros ArgumentMatchers para agrupar o restante dos argumentos:
fonte
Eu acho que a maneira mais fácil de verificar um objeto de argumento é usar o
refEq
método:Pode ser usado mesmo se o objeto não for implementado
equals()
, porque a reflexão é usada. Se você não quiser comparar alguns campos, basta adicionar seus nomes como argumentos pararefEq
.fonte
Mais uma possibilidade, se você não quiser usar
ArgumentCaptor
(por exemplo, porque você também está usando stubbing), é usar o Hamcrest Matchers em combinação com o Mockito.fonte
Matchers
pacote está correto, pois a gravação da mesma linha de código com aorg.mockito.Matchers
classe gera uma exceção enganosa, afirmando que o parâmetro da função mock simplesmente não corresponde.MockitoHamcrest.argThat()
e não éMockito.argThat()
Esta é uma resposta baseada na resposta do iraSenthil, mas com anotação ( Captor ). Na minha opinião, tem algumas vantagens:
Exemplo:
fonte
captor.getAllValues()
. O métodocaptor.getValue()
usado na resposta fornece o último resultado.Se você estiver usando Java 8, poderá usar expressões Lambda para corresponder.
Chamada de exemplo
Mais informações: http://source.coveo.com/2014/10/01/java8-mockito/
fonte
As soluções acima realmente não funcionaram no meu caso. Não pude usar o ArgumentCaptor porque o método foi chamado várias vezes e eu precisava validar cada um. Um simples Matcher com "argThat" fez o truque facilmente.
Correspondente personalizado
Test Runner
fonte
E solução muito agradável e limpa em koltin de
com.nhaarman.mockito_kotlin
fonte
Você pode consultar o seguinte:
Isso verificará se o método mockedObject é chamado com o desejadoObject como parâmetro.
fonte
Outra maneira fácil de fazer isso:
fonte
O javadoc para refEq mencionou que a verificação de igualdade é superficial! Você pode encontrar mais detalhes no link abaixo:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String...))[1]
O problema "igualdade rasa" não pode ser controlado quando você usa outras classes que não implementam o método .equals (), a classe "DefaultMongoTypeMapper" é um exemplo em que o método .equals () não é implementado.
org.springframework.beans.factory.support oferece um método que pode gerar uma definição de bean em vez de criar uma instância do objeto e pode ser usado para se livrar da Comparison Failure.
** "A definição do bean é apenas uma descrição do bean, não um bean em si. As descrições do bean implementam corretamente equals () e hashCode (), portanto, em vez de criar um novo DefaultMongoTypeMapper (), fornecemos uma definição que informa ao Spring como deve criar um "
No seu exemplo, você pode fazer algo assim
fonte
Uma solução simplificada, sem criar uma nova classe de implementação do Matcher e usar a expressão lambda:
fonte