Atualmente, estou no processo de usar o Mockito para simular meus objetos da camada de serviço em um aplicativo Spring MVC no qual desejo testar meus métodos do Controller. No entanto, como eu tenho lido sobre as especificidades do Mockito, descobri que os métodos doReturn(...).when(...)
são equivalentes when(...).thenReturn(...)
. Então, minha pergunta é: qual é o sentido de ter dois métodos que fazem a mesma coisa ou qual é a diferença sutil entre doReturn(...).when(...)
ewhen(...).thenReturn(...)
?
Qualquer ajuda seria apreciada.
java
unit-testing
mockito
Pantera negra
fonte
fonte
doReturn()
é útil.Respostas:
As duas sintaxes para stub são aproximadamente equivalentes. No entanto, você sempre pode usar
doReturn/when
para stubbing; mas há casos em que você não pode usarwhen/thenReturn
. Stubbing void methods é um desses. Outros incluem o uso de espiões de Mockito e a remoção do mesmo método mais de uma vez.Uma coisa que
when/thenReturn
te dá, quedoReturn/when
e não fornece, é a verificação de tipo do valor que você está retornando, no momento da compilação. No entanto, acredito que isso quase não tem valor - se você errou o tipo, descobrirá assim que executar o teste.Eu recomendo fortemente apenas o uso
doReturn/when
. Não há sentido em aprender duas sintaxes quando uma delas funciona.Você pode consultar a minha resposta em Formando Mockito "gramáticas" - uma resposta mais detalhada a uma questão muito relacionada.
fonte
doReturn/when
e passo os próximos minutos descobrindo o que deu errado. A verificação de tipo de tipo de compilação se torna extremamente útilwhen/thenReturn
.when/thenReturn
vez dedoReturn/when
.doReturn/when
é uma troca. A equipe não recomenda de uma maneira ou de outra, mas observe que awhen/then
abordagem é mais intuitiva, mais legível e oferece verificação do tempo de compilação; foi a abordagem que tornou o Mockito popular e fácil de usar, não se esqueça que, quando o código base é compartilhado por várias habilidades em sua equipe; no entanto, há desvantagens em relação a espiões e métodos vazios.doReturn()
tem a grande desvantagem de se transformar na codificação no estilo YODA de chamadas de método. A coisa que vem depois é escrita primeiro. A maioria das pessoas lê da esquerda para a direita; agora você precisa se lembrar constantemente de reverter a lógica do retorno quando em sua cabeça.Ambas as abordagens se comportam de maneira diferente se você usar um objeto espionado (anotado com
@Spy
) em vez de um mock (anotado com@Mock
):when(...) thenReturn(...)
faz uma chamada de método real pouco antes do valor especificado ser retornado. Portanto, se o método chamado lança uma exceção, você precisa lidar com isso / zombar etc. É claro que você ainda obtém seu resultado (o que você definethenReturn(...)
)doReturn(...) when(...)
não chama o método .Exemplo:
Teste:
fonte
doReturn()
, parece um abuso da biblioteca. O ponto de espionagem em vez de pura zombaria é tirar proveito de chamadas reais. Eles também alertam contra o uso de Spies como este: github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) (e recomendam estender a classe e substituir o método)O javadoc do Mockito parece dizer por que usar em
doReturn()
vez dewhen()
Usar doReturn () nas raras ocasiões em que você não pode usar o Mockito.when (Object).fonte
Continuando com esta resposta , há outra diferença: se você deseja que seu método retorne valores diferentes, por exemplo, quando é chamado pela primeira vez, chamado pela segunda vez, etc., você pode passar valores, por exemplo ...
Portanto, ele retornará falso quando o método for chamado no mesmo caso de teste e, em seguida, retornará falso novamente e, finalmente, verdadeiro.
fonte
A última alternativa é usada para métodos em zombarias que retornam
void
.Por favor, dê uma olhada, por exemplo, aqui: Como criar métodos mock to void com mockito
fonte