Meu código é como abaixo,
@RunWith(MockitoJUnitRunner.class)
public class MyClass {
private static final String code ="Test";
@Mock
private MyClassDAO dao;
@InjectMocks
private MyClassService Service = new MyClassServiceImpl();
@Test
public void testDoSearch() throws Exception {
final String METHOD_NAME = logger.getName().concat(".testDoSearchEcRcfInspections()");
CriteriaDTO dto = new CriteriaDTO();
dto.setCode(code);
inspectionService.searchEcRcfInspections(dto);
List<SearchCriteriaDTO> summaryList = new ArrayList<SearchCriteriaDTO>();
inspectionsSummaryList.add(dto);
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
verify(dao).doSearchInspections(dto);
}
}
Estou ficando abaixo da exceção
org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected in test class: Test Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at service.Test.testDoSearch(Test.java:72) Please remove unnecessary stubbings or use 'silent' option. More info: javadoc for UnnecessaryStubbingException class. at org.mockito.internal.exceptions.Reporter.formatUnncessaryStubbingException(Reporter.java:838) at org.mockito.internal.junit.UnnecessaryStubbingsReporter.validateUnusedStubs(UnnecessaryStubbingsReporter.java:34) at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:49) at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:103) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Por favor me ajude como resolver
@RunWith(MockitoJUnitRunner.Silent.class)
e não SILENCIOSO@RunWith(MockitoJUnitRunner.Silent::class)
Em primeiro lugar, você deve verificar sua lógica de teste. Normalmente são 3 casos. Primeiro, você está simulando um método errado (você cometeu um erro de digitação ou alguém alterou o código testado para que o método simulado não seja mais usado). Em segundo lugar, seu teste está falhando antes que este método seja chamado. Terceiro, sua lógica falha se / switch se ramificar em algum lugar no código, de forma que o método simulado não seja chamado.
Se este for o primeiro caso, você sempre deseja alterar o método simulado para aquele usado no código. Com o segundo e o terceiro, depende. Normalmente, você deve apenas excluir este mock se não tiver uso. Mas às vezes há certos casos em testes parametrizados, que devem seguir esse caminho diferente ou falhar antes. Em seguida, você pode dividir este teste em dois ou mais testes separados, mas nem sempre é bonito. 3 métodos de teste com possivelmente 3 provedores de argumentos podem fazer seu teste parecer ilegível. Nesse caso, para JUnit 4, você silencia essa exceção com qualquer
anotação ou se você estiver usando abordagem de regra
ou (o mesmo comportamento)
Para testes JUnit 5, você pode silenciar essa exceção usando a anotação fornecida no
mockito-junit-jupiter
pacote.fonte
Mockito.lenient().when(...)
; para esta questão em particular seriaMockito.lenient().when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);
Silêncio não é solução. Você precisa corrigir seu mock em seu teste. Veja a documentação oficial aqui .
Stubs desnecessários são chamadas de método em stub que nunca foram realizadas durante a execução do teste (consulte também MockitoHint), exemplo:
Observe que um dos métodos de stub nunca foi realizado no código em teste, durante a execução do teste. O stub desgarrado pode ser uma omissão do desenvolvedor, o artefato de copiar e colar ou o efeito de não compreensão do teste / código. De qualquer forma, o desenvolvedor acaba com um código de teste desnecessário. Para manter a base de código limpa e sustentável, é necessário remover o código desnecessário. Caso contrário, os testes são mais difíceis de ler e raciocinar.
Para saber mais sobre como detectar stubbings não utilizados, consulte MockitoHint.
fonte
Para mim, nem o
@Rule
nem as@RunWith(MockitoJUnitRunner.Silent.class)
sugestões funcionaram. Era um projeto legado em que atualizamos para o mockito-core 2.23.0.Poderíamos nos livrar do
UnnecessaryStubbingException
usando:ao invés de:
Desnecessário dizer que você deve preferir olhar para o código de teste, mas primeiro precisamos ter o material compilado e os testes rodando;)
fonte
O
when
aqui configura sua simulação para fazer algo. No entanto, você não usa mais esse mock de forma alguma após essa linha (além de fazer umverify
). Mockito avisa que awhen
linha, portanto, não tem sentido. Talvez você tenha cometido um erro lógico?fonte
Service
) para ver se ela reage corretamente. Você não fez nada disso, então o que está testando aqui?Olhando para uma parte do rastreamento de pilha, parece que você está copiando em
dao.doSearch()
outro lugar. Mais como criar repetidamente os stubs do mesmo método.Considere a classe de teste abaixo, por exemplo:
Eu preferiria considerar a refatoração de seus testes para stub quando necessário.
fonte
Se você estiver usando este estilo:
substitua-o por:
fonte
Substituir
@RunWith(MockitoJUnitRunner.class)
com
@RunWith(MockitoJUnitRunner.Silent.class)
ou remover
@RunWith(MockitoJUnitRunner.class)
ou apenas comente as chamadas mocking indesejadas (mostrado como stub não autorizado).
fonte
Eu tinha
UnnecessaryStubbingException
quando tentei usar oswhen
métodos em um objeto Spy.Mockito.lenient()
silenciou a exceção, mas os resultados do teste não estavam corretos.No caso de objetos Spy, é necessário chamar os métodos diretamente.
fonte
Bem, no meu caso, o erro do Mockito estava me dizendo para chamar o método real após o stub
when
ouwhenever
. Como não estávamos invocando as condições que acabamos de zombar, Mockito estava relatando isso como stubs ou código desnecessários.Aqui está como era quando o erro estava chegando:
então, acabei de chamar o método real mencionado na instrução when para simular o método.
as mudanças feitas são como abaixo
stockViewModelTest.getStockAvailability(listOf(), getStocksApiCallBack)
está funcionando agora.
fonte
No caso de um grande projeto, é difícil corrigir cada uma dessas exceções. Ao mesmo tempo, o uso
Silent
não é recomendado. Eu escrevi um script para remover todos os stubbings desnecessários dada uma lista deles.https://gist.github.com/cueo/da1ca49e92679ac49f808c7ef594e75b
Precisamos apenas copiar e colar a
mvn
saída e escrever a lista dessas exceções usando regex e deixar o script cuidar do resto.fonte
Se você usar any () durante a simulação, será necessário espaçar novamente @RunWith (MockitoJUnitRunner.class) com @RunWith (MockitoJUnitRunner.Silent.class).
fonte
Quando você cria um mock e esse mock não é usado, ele lança uma exceção de stub não usada. No seu caso, esse mock não é realmente chamado. Portanto, ele está jogando esse erro. Portanto, relpace
@RunWith(MockitoJUnitRunner.class)
com o@RunWith(MockitoJUnitRunner.Silent.class)
qual removeria o erro. Se você ainda quiser usar,@RunWith(MockitoJUnitRunner.class)
tente depurar sua lógica se a função que você simulou está realmente sendo chamada ou não.fonte