Estou tentando testar algum código legado, usando o Mockito.
Desejo stub a FooDao
que é usado na produção da seguinte maneira:
foo = fooDao.getBar(new Bazoo());
Eu consigo escrever:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Mas o problema óbvio é que getBar()
nunca é chamado com o mesmo Bazoo
objeto para o qual eu apaguei o método. (Amaldiçoe esse new
operador!)
Eu adoraria se pudesse stub o método de uma maneira que ele retornasse myFoo
independentemente do argumento. Caso contrário, ouvirei outras sugestões de solução alternativa, mas gostaria muito de evitar a alteração do código de produção até que haja uma cobertura de teste razoável.
java
unit-testing
mocking
mockito
Eric Wilson
fonte
fonte
notNull(Bazoo.class)
assim como oany(Bazoo.class)
(talvez ele não existia no momento desta resposta)Bazoo
ouCazoo
quais são as duas subclasses de, digamosAzoo
,. porqueBazoo
eu precisava voltarfoo
, masCazoo
eu precisava voltarbar
. nessa situação, aMatchers.any()
solução proposta não funciona, no entanto,Matchers.isA()
funciona perfeitamente.org.mockito.Matchers
agora é preterido - utilizaçãoorg.mockito.ArgumentMatchers
em vez, ou seja,import static org.mockito.ArgumentMatchers.*
(ver documentos )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
Use assim:
Antes de precisar importar
Mockito.Matchers
fonte
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
deve atender às suas necessidades.Além disso, você sempre pode considerar a implementação
hashCode()
eequals()
aBazoo
classe. Isso faria seu exemplo de código funcionar da maneira que você deseja.fonte
Outra opção é confiar no bom
equals
método à moda antiga . Enquanto o argumento nowhen
mockequals
o argumento no código sendo testado, o Mockito corresponderá ao mock.Aqui está um exemplo.
supondo que você saiba qual será o valor
someField
, você pode zombar assim.prós: isso é mais explícito que os
any
correspondentes. Como revisor de código, fico de olhoany
no código que os desenvolvedores juniores escrevem, pois olha a lógica do código para gerar o objeto apropriado que está sendo passado.con: Às vezes, o campo que está sendo passado para o objeto é um ID aleatório. Nesse caso, você não pode construir facilmente o objeto de argumento esperado no seu código simulado.
Outra abordagem possível é usar o
Answer
objeto de Mockito que pode ser usado com owhen
métodoAnswer
permite interceptar a chamada real e inspecionar o argumento de entrada e retornar um objeto simulado. No exemplo abaixo, estou usandoany
para capturar qualquer solicitação para o método que está sendo ridicularizado. Mas então, noAnswer
lambda, posso inspecionar ainda mais o argumento Bazo ... talvez para verificar se um ID adequado foi passado para ele. Prefiro issoany
por si só, para que pelo menos alguma inspeção seja feita no argumento.Então, para resumir tudo, eu gosto de confiar
equals
(onde o argumento esperado e o argumento real devem ser iguais um ao outro) e se igual não for possível (devido à incapacidade de prever o estado real do argumento), vou recorrer paraAnswer
inspecionar o argumento.fonte