2
respostas

Mocks que lançam exceções

Olá,

O trecho abaixo é um teste que estou estudando na Aula 03.02 do curso de Testes. O Erro é o seguinte:

Quando eu digo para lançar uma excption, doThrow(), e passo o primeiro item da lista, leiloes.get(0), e no verify(), passo o 2 item da lista, leiloes.get(1), gera um erro do tipo:

Argument(s) are different! Wanted:

Falhando o teste.

Porém, quando faço uma inversão, no doThrow() passo o segundo item da lista, e no verify passo o primeiro, ele aceita e o teste executa com sucesso.

Penso que pelo fato de gerar a exceção no primeiro item, o segundo não funciona. Mas, existe um Try Catch no local correto e deveria pegar essa exceção, tratando-a, e seguindo o processamento normal.

Será que tenho algo errado no meu código?

trecho do código que tem o try catch:

for (Leilao leilao : todosLeiloesCorrentes) {
            try {
                if (comecouSemanaPassada(leilao)) {
                    leilao.encerra();
                    total++;
                    dao.atualiza(leilao);
                    carteiro.envia(leilao);
                }
            }catch (Exception e){

            }
        }

Classe de teste:

   private List<Leilao> leiloes;

    @Before
    public void criarLeiloes() {

        leiloes = new LinkedList<Leilao>();

        Leilao leilao1;
        Leilao leilao2;
        Leilao leilao3;
        Calendar antiga = Calendar.getInstance();
        antiga.add(Calendar.DATE, -20);

        Calendar hoje = Calendar.getInstance();
        hoje.setTime(new Date());

        Calendar aCincoDias = Calendar.getInstance();
        aCincoDias.setTime(new Date());
        aCincoDias.add(Calendar.DATE, -5);

        leilao1 = new CriadorDeLeilao().para("Playstation 3 Novo").naData(antiga).constroi();
        leilao2 = new CriadorDeLeilao().para("TV").naData(hoje).constroi();
        leilao3 = new CriadorDeLeilao().para("Notebook").naData(aCincoDias).constroi();

        leiloes.add(leilao1);
        leiloes.add(leilao2);
        leiloes.add(leilao3);

}

@Test
public void teste() {
       LeilaoDao leilaoDao = mock(LeilaoDao.class);
        EnviadorDeEmail carteiro = mock(EnviadorDeEmail.class);

        when(leilaoDao.correntes()).thenReturn(leiloes);
        doThrow(new RuntimeException()).when(leilaoDao).atualiza(leiloes.get(0));

        EncerradorDeLeilao encerradorDeLeilao = new EncerradorDeLeilao(leilaoDao, carteiro);
        encerradorDeLeilao.encerra();

        verify(leilaoDao).atualiza(leiloes.get(1));
        verify(carteiro).envia(leiloes.get(1));
}
2 respostas

Você tem o restante da mensagem Argument(s) are different! Wanted:? talvez tenha alguma dica, olhando seu código não me aparenta em um primeiro momento nada de errado

Argument(s) are different! Wanted:
leilaoDao.atualiza(
    br.com.caelum.leilao.dominio.Leilao@2a2d45ba
);
-> at br.com.caelum.leilao.servico.EncerradorDeLeilaoTest.deveContinuaAExecucaoMesmoQuandoLancadoUmaExcecao(EncerradorDeLeilaoTest.java:126)
Actual invocation has different arguments:
leilaoDao.atualiza(
    br.com.caelum.leilao.dominio.Leilao@32d992b2
);
-> at br.com.caelum.leilao.servico.EncerradorDeLeilao.encerra(EncerradorDeLeilao.java:29)

Comparison Failure:  <Click to see difference>

Argument(s) are different! Wanted:
leilaoDao.atualiza(
    br.com.caelum.leilao.dominio.Leilao@2a2d45ba
);
-> at br.com.caelum.leilao.servico.EncerradorDeLeilaoTest.deveContinuaAExecucaoMesmoQuandoLancadoUmaExcecao(EncerradorDeLeilaoTest.java:126)
Actual invocation has different arguments:
leilaoDao.atualiza(
    br.com.caelum.leilao.dominio.Leilao@32d992b2
);
-> at br.com.caelum.leilao.servico.EncerradorDeLeilao.encerra(EncerradorDeLeilao.java:29)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at br.com.caelum.leilao.servico.EncerradorDeLeilaoTest.deveContinuaAExecucaoMesmoQuandoLancadoUmaExcecao(EncerradorDeLeilaoTest.java:126)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software