Estou usando o Mockito 1.9.0. Eu quero simular o comportamento de um único método de uma classe em um teste JUnit, então eu tenho
final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.when(myClassSpy.method1()).thenReturn(myResults);
O problema é que, na segunda linha, myClassSpy.method1()
está realmente sendo chamado, resultando em uma exceção. A única razão pela qual estou usando zombarias é que, mais tarde, sempre que myClassSpy.method1()
for chamado, o método real não será chamado e o myResults
objeto será retornado.
MyClass
é uma interface e myInstance
é uma implementação disso, se isso importa.
O que preciso fazer para corrigir esse comportamento de espionagem?
Respostas:
Deixe-me citar a documentação oficial :
No seu caso, é algo como:
fonte
send
método está sendo chamadoMeu caso foi diferente da resposta aceita. Eu estava tentando zombar de um método privado de pacote para uma instância que não vivia nesse pacote
e as classes de teste
A compilação está correta, mas quando tenta configurar o teste, invoca o método real.
Declarar o método protegido ou público corrige o problema, embora não seja uma solução limpa.
fonte
No meu caso, usando o Mockito 2.0, tive que alterar todos os
any()
parâmetrosnullable()
para stub da chamada real.fonte
foo = Mockito.spy(foo);
Mockito.doReturn(someValue).when(foo).methodToPrevent(nullable(ArgumentType.class));
any
eeq
matchers.A resposta de Tomasz Nurkiewicz parece não contar toda a história!
NB Mockito versão: 1.10.19.
Eu sou muito novato no Mockito, então não posso explicar o seguinte comportamento: se houver um especialista por aí que possa melhorar essa resposta, sinta-se à vontade.
O método em questão aqui ,, NÃO
getContentStringValue
é e NÃO .final
static
Esta linha faz chamar o método original
getContentStringValue
:Esta linha não chama o método original
getContentStringValue
:Por razões que não posso responder, o uso
isA()
faz com que o comportamento pretendido (?) "Não chame método"doReturn
falhe.Vejamos as assinaturas de método envolvidas aqui: ambos são
static
métodosMatchers
. Ambos dizem que o Javadoc retornaránull
, o que é um pouco difícil de entender. Presumivelmente, oClass
objeto passado quando o parâmetro é examinado, mas o resultado nunca é calculado ou descartado. Dado que issonull
pode representar qualquer classe e que você espera que o método zombado não seja chamado, as assinaturasisA( ... )
eany( ... )
apenas retornam, emnull
vez de um parâmetro genérico *<T>
?De qualquer forma:
A documentação da API não fornece nenhuma pista sobre isso. Parece também dizer que a necessidade de tal comportamento "não chame método" é "muito rara". Pessoalmente, uso essa técnica o tempo todo : normalmente, acho que a zombaria envolve algumas linhas que "definem o cenário" ... seguidas chamando um método que "reproduz" a cena no contexto de simulação que você organizou. ... e enquanto você está montando o cenário e os acessórios, a última coisa que você quer é que os atores entrem no palco à esquerda e comecem a representar seus corações ...
Mas isso está muito além do meu salário ... Convido explicações de qualquer sumo sacerdote que passe por Mockito ...
* "parâmetro genérico" é o termo certo?
fonte
Mais um cenário possível que pode causar problemas com espiões é quando você está testando o spring beans (com estrutura de teste de primavera) ou alguma outra estrutura que faz proxy de seus objetos durante o teste .
Exemplo
No código acima, o Spring e o Mockito tentarão proxy seu objeto MonitoringDocumentsRepository, mas o Spring será o primeiro, o que causará a chamada real do método findMonitoringDocuments. Se depurarmos nosso código logo após colocar um espião no objeto de repositório, ele se parecerá com este no depurador:
@SpyBean para o resgate
Se, em vez disso
@Autowired
, usarmos a@SpyBean
anotação, resolveremos o problema acima, a anotação do SpyBean também injetará o objeto do repositório, mas será primeiro proxyizado pelo Mockito e será semelhante a esse dentro do depuradore aqui está o código:
fonte
Encontrei mais um motivo para o espião chamar o método original.
Alguém teve a idéia de zombar de uma
final
classe e descobriu sobreMockMaker
:Fonte: https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#mock-the-unmockable-opt-in-mocking-of-final-classesmethods
Após mesclar e trazer esse arquivo para minha máquina, meus testes falharam.
Eu apenas tive que remover a linha (ou o arquivo) e
spy()
funcionou.fonte
Um pouco atrasado para a festa, mas as soluções acima não funcionaram para mim, então compartilhar meus 0,02 $
Versão Mokcito: 1.10.19
MyClass.java
Test.java
A seguir NÃO funcionou para mim (o método real estava sendo chamado):
1
2)
3)
Seguinte TRABALHADO:
fonte
Uma maneira de garantir que um método de uma classe não seja chamado é substituir o método por um fictício.
fonte
Resposta para usuários do scala: Mesmo colocando o
doReturn
primeiro não funciona! Veja este post .fonte