public class A { método public void (boolean b) { if (b == true) Método 1(); outro método2 (); } private void method1 () {} método void privado2 () {} }
public class TestA { @Teste public void testMethod () { A a = simulação (classe A.); a.method (true); // como testar como verify (a) .method1 (); } }
Como testar o método privado é chamado ou não, e como testar o método privado usando mockito ???
Respostas:
Você não pode fazer isso com o Mockito, mas pode usar o Powermock para estender o Mockito e simular métodos privados. Powermock suporta Mockito. Aqui está um exemplo.
fonte
Não é possível através do mockito. De seu wiki
fonte
Aqui está um pequeno exemplo de como fazer isso com o powermock
Para testar o método 1, use o código:
Para definir objeto particular obj usar este:
fonte
Pense nisso em termos de comportamento, não em termos dos métodos que existem. O método chamado
method
tem um comportamento particular seb
for verdadeiro. Ele tem um comportamento diferente seb
for falso. Isso significa que você deve escrever dois testes diferentes paramethod
; um para cada caso. Portanto, em vez de ter três testes orientados a método (um paramethod
, um paramethod1
, um paramethod2
, você tem dois testes orientados para o comportamento.Relacionado a isso (eu sugeri isso em outro tópico do SO recentemente e fui chamado de uma palavra de quatro letras como resultado, então sinta-se à vontade para aceitar isso com um grão de sal); Acho útil escolher nomes de teste que reflitam o comportamento que estou testando, em vez do nome do método. Portanto, não chamar seus testes
testMethod()
,testMethod1()
,testMethod2()
e assim por diante. Gosto de nomes comocalculatedPriceIsBasePricePlusTax()
outaxIsExcludedWhenExcludeIsTrue()
que indicam o comportamento que estou testando; em seguida, em cada método de teste, teste apenas o comportamento indicado. A maioria desses comportamentos envolverá apenas uma chamada para um método público, mas pode envolver muitas chamadas para métodos privados.Espero que isto ajude.
fonte
Embora o Mockito não forneça esse recurso, você pode obter o mesmo resultado usando Mockito + a classe JUnit ReflectionUtils ou a classe Spring ReflectionTestUtils . Veja um exemplo abaixo tirado daqui, explicando como invocar um método privado:
Exemplos completos com ReflectionTestUtils e Mockito podem ser encontrados no livro Mockito for Spring
fonte
Você não deve testar métodos privados. Apenas métodos não privados precisam ser testados, pois eles devem chamar os métodos privados de qualquer maneira. Se você "deseja" testar métodos privados, isso pode indicar que você precisa repensar seu design:
Estou usando injeção de dependência adequada? Eu possivelmente preciso mover os métodos privados para uma classe separada e testar isso? Esses métodos devem ser privados? ... eles não podem ser padrão ou protegidos?
No caso acima, os dois métodos chamados "aleatoriamente" podem realmente precisar ser colocados em uma classe própria, testados e, em seguida, injetados na classe acima.
fonte
Consegui testar um método privado usando mockito usando reflexão. Aqui está o exemplo, tentei nomeá-lo de forma que faça sentido
fonte
Usando reflexão, métodos privados podem ser chamados de classes de teste. Nesse caso,
// método de teste será assim ...
Se o método privado chamar qualquer outro método privado, então precisamos espiar o objeto e fazer o stub do outro método. A classe de teste será como ...
// método de teste será assim ...
** A abordagem é combinar reflexão e espiar o objeto. ** método1 e ** método2 são métodos privados e método1 chama método2.
fonte
Eu realmente não entendo sua necessidade de testar o método privado. A raiz do problema é que seu método público tem void como tipo de retorno e, portanto, você não pode testar seu método público. Portanto, você é forçado a testar seu método privado. Meu palpite está correto?
Algumas soluções possíveis (AFAIK):
Zombando de seus métodos privados, mas ainda assim você não estará "realmente" testando seus métodos.
Verifique o estado do objeto usado no método. A MAIORIA dos métodos faz algum processamento dos valores de entrada e retorna uma saída, ou altera o estado dos objetos. Testar os objetos para o estado desejado também pode ser empregado.
Refatore seu código um pouco (espero que este não seja um código legado). Meu fundamento para escrever um método é que sempre se deve retornar algo (um int / um booleano). O valor retornado PODE ou NÃO ser usado pela implementação, mas COM CERTEZA SERÁ usado pelo teste
código.
fonte
Na verdade, existe uma maneira de testar métodos de um membro privado com o Mockito. Digamos que você tenha uma aula como esta:
Se você quiser testar
a.method
irá chamar um método deSomeOtherClass
, você pode escrever algo como abaixo.ReflectionTestUtils.setField();
irá stubar o membro privado com algo que você pode espionar.fonte
Coloque seu teste no mesmo pacote, mas em uma pasta de origem diferente (src / main / java vs. src / test / java) e torne esses métodos package-private. A testabilidade do Imo é mais importante do que a privacidade.
fonte
Nos casos em que o método privado não é nulo e o valor de retorno é usado como parâmetro para um método de dependência externa, você pode simular a dependência e usar um
ArgumentCaptor
para capturar o valor de retorno. Por exemplo:fonte