Eu escrevo um teste de unidade e quero usar JUnitParamsRunner
eMockitoJUnitRunner
para uma aula de teste.
Infelizmente, o seguinte não funciona:
@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
Existe uma maneira de usar Mockito e JUnitParams em uma classe de teste?
java
unit-testing
junit
Hans-Helge
fonte
fonte
Respostas:
Você não pode fazer isso porque de acordo com as especificações, você não pode colocar a mesma anotação duas vezes no mesmo elemento anotado.
Então qual é a solução? A solução é colocar apenas um
@RunWith()
com o corredor sem o qual você não pode ficar e substituir outro por outra coisa. No seu caso, acho que você removeráMockitoJUnitRunner
e fará programaticamente o que ele faz.Na verdade, a única coisa que ele faz é:
no início do caso de teste. Portanto, a solução mais simples é colocar este código em
setUp()
método:Não tenho certeza, mas provavelmente você deve evitar várias chamadas desse método usando o sinalizador:
Por melhor que seja, a solução reutilizável pode ser implementada com as regras da JUnt.
Agora basta adicionar a seguinte linha à sua classe de teste:
e você pode executar este caso de teste com qualquer runner que desejar.
fonte
mockInitialized
está errada. Você quer ter uma nova simulação para cada teste.A partir do JUnit 4.7 e do Mockito 1.10.17, essa funcionalidade é integrada; existe uma
org.mockito.junit.MockitoRule
classe. Você pode simplesmente importá-lo e adicionar a linhapara sua aula de teste.
fonte
@Rule public MockitoJUnitRule mockito = new MockitoJUnitRule(this);
MockitoAnnotations.initMocks(this)
é muito lento para criar simulações. A maneira mais eficiente é usar o @Runwith (MockitoJunitRunner.class)Esta solução funciona para todos os corredores possíveis, não apenas para este exemplo do mockito. Por exemplo; para Spring, apenas altere as classes do runner e adicione as anotações necessárias.
DatabaseModelTest
será executado por JUnit.TestMockitoJUnitRunner
depende dele (pela lógica) e será executado dentro do main em um@Test
método, durante a chamadaJUnitCore.runClasses(TestMockitoJUnitRunner.class)
. Este método garante que o runner principal seja iniciado corretamente antes que ostatic class TestMockitoJUnitRunner
sub-runner seja executado, implementando efetivamente várias@RunWith
anotações aninhadas com classes de teste dependentes.Também em https://bekce.github.io/junit-multiple-runwith-dependent-tests
fonte
JUnitCore.runClasses()
sem inspecionar o resultado, você corre o risco de mascarar os erros do teste interno.assert(JUnitCore.runClasses(TestMockitoJUnitRunner.class).wasSuccessful());
irá, pelo menos, relatar o erro para vocêDesde o lançamento do PowerMock 1.6, você pode fazer isso tão facilmente quanto
Explicado aqui https://blog.jayway.com/2014/11/29/using-another-junit-runner-with-powermock/
fonte
No meu caso, eu estava tentando zombar de algum método no feijão da primavera e
não funciona. Em vez disso, você tem que definir aquele bean a ser construído usando o método mock dentro de seu arquivo xml como segue.
e adicione aquele bean com autowired dentro de sua classe de teste como a seguir.
fonte
verifique este link https://bekce.github.io/junit-multiple-runwith-dependent-tests/ usando esta abordagem eu combinei um @RunWith (Parameterized.class) - corredor externo - com @RunWith (MockitoJUnitRunner.class) - corredor interno. O único ajuste que tive de adicionar foi tornar estáticas minhas variáveis de membro na classe externa / runner para torná-las acessíveis para o runner / classe interna / aninhada. dê sorte e divirta-se.
fonte
Eu queria executar SWTBotJunit4ClassRunner e org.junit.runners.Parameterized ao mesmo tempo, tenho testes paramétricos e quero fazer capturas de tela quando o teste SWT falha (o recurso de captura de tela é fornecido pelo SWTBotJunit4ClassRunner ). A resposta de @bekce é ótima e primeiro queria seguir esse caminho, mas foi estranho passar pelos argumentos. Ou fazendo o parametrizado na subclasse e perdendo as informações de quais testes exatos passaram / falharam e ter apenas a última captura de tela (já que os nomes das capturas de tela obtêm o nome do próprio teste). De qualquer forma, foi um pouco confuso.
No meu caso o SWTBotJunit4ClassRunner é bastante simples, então eu clonei o código-fonte da classe, dei meu próprio nome ParametrizedScreenshotRunner e onde o original estava estendendo o TestRunner , minha classe está estendendo o Parameterized classe então posso usar meu próprio runner em vez dos dois anteriores. Fervido meu próprio runner se estende em cima do runner Parametrizado enquanto implemento o recurso de captura de tela em cima dele, agora meu teste usa este runner "híbrido" e todos os testes funcionam como esperado imediatamente (não há necessidade de alterar nada dentro dos testes).
É assim que parece (por uma questão de brevidade, removi todos os comentários da lista):
fonte
Você também pode tentar isto:
fonte