Como zombar de métodos com o tipo de retorno nulo?
Eu implementei um padrão de observador, mas não posso zombar dele com Mockito porque não sei como.
E tentei encontrar um exemplo na Internet, mas não obtive sucesso.
Minha classe fica assim:
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
O sistema não é acionado com simulação.
Eu quero mostrar o estado do sistema acima mencionado. E faça afirmações de acordo com eles.
Respostas:
Dê uma olhada nos documentos da API do Mockito . Como o documento vinculado menciona (ponto # 12), você pode usar qualquer um dos
doThrow()
,doAnswer()
,doNothing()
,doReturn()
família de métodos de quadro Mockito para zombar métodos vazios.Por exemplo,
ou se você deseja combiná-lo com o comportamento de acompanhamento,
Presumindo que você esteja zombando do levantador
setState(String s)
na classe Mundo abaixo, o código usa odoAnswer
método para zombar dosetState
.fonte
setRate()
é essefinal
e, portanto, não pode ser ridicularizado. Em vez disso, tentecreate()
criar uma instância que faça o que você precisa. Não deve haver necessidade de zombariaRateLimiter
.Acho que encontrei uma resposta mais simples para essa pergunta, para chamar o método real para apenas um método (mesmo que tenha um retorno nulo), você pode fazer isso:
Ou, você pode chamar o método real para todos os métodos dessa classe, fazendo o seguinte:
fonte
Adicionando o que o @sateesh disse, quando você apenas deseja zombar de um método nulo para impedir que o teste o chame, você pode usar o
Spy
seguinte:Quando você deseja executar seu teste, certifique-se de chamar o método test no
spy
objeto e não noworld
objeto. Por exemplo:fonte
A solução do chamado problema é usar um
spy
Mockito.spy (...) em vez de ummock
Mockito.mock (..) .O espião nos permite zombar parcial. Mockito é bom nesse assunto. Como você tem uma classe que não está completa, você zomba de algum lugar necessário nessa classe.
fonte
Primeiro de tudo: você deve sempre importar mockito estático, assim o código será muito mais legível (e intuitivo):
Para zombar parcial e ainda manter a funcionalidade original, o mockito oferece "Spy".
Você pode usá-lo da seguinte maneira:
Para evitar que um método seja executado, você pode usar algo como isto:
para dar um comportamento personalizado a um método, use "when" com um "thenReturn":
Para mais exemplos, encontre os excelentes exemplos de mockito no documento.
fonte
Como zombar de métodos nulos com o mockito - existem duas opções:
doAnswer
- Se queremos que o nosso método de simulação faça algo (zombe do comportamento, apesar de ser nulo).doThrow
- Então existeMockito.doThrow()
se você deseja lançar uma exceção do método de simulação falsa.A seguir, é apresentado um exemplo de como usá-lo (não é um caso ideal, mas apenas para ilustrar o uso básico).
Você pode encontrar mais detalhes sobre como zombar e testar métodos nulos com o Mockito no meu post Como zombar do Mockito (Um guia completo com exemplos)
fonte
Adicionando outra resposta ao grupo (sem trocadilhos) ...
Você precisa chamar o método doAnswer se não puder \ não quiser usar o espião. No entanto, você não precisa necessariamente lançar sua própria resposta . Existem várias implementações padrão. Notavelmente, CallsRealMethods .
Na prática, parece algo como isto:
Ou:
fonte
No Java 8, isso pode ser um pouco mais limpo, supondo que você tenha uma importação estática para
org.mockito.Mockito.doAnswer
:O
return null;
é importante e, sem ele, a compilação falhará com alguns erros bastante obscuros, pois não será capaz de encontrar uma substituição adequadadoAnswer
.Por exemplo, um
ExecutorService
que execute imediatamente qualquerRunnable
passagem paraexecute()
poderia ser implementado usando:fonte
Eu acho que seus problemas se devem à sua estrutura de teste. Achei difícil misturar a zombaria com o método tradicional de implementação de interfaces na classe de teste (como você fez aqui).
Se você implementar o ouvinte como um Mock, poderá verificar a interação.
Isso deve te convencer de que o 'Mundo' está fazendo a coisa certa.
fonte
Usando Mockito.doThrow como em:
você pode tentar este bom exemplo:
Fonte: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
fonte