Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvida no Ex. 70 da Aula 1 - Simulando comportamentos com Mock Objects

EncerradorDeLeilao encerrador = new EncerradorDeLeilao(daoFalso); encerrador.encerra(); // ERRO!

8 respostas

Oi Carla,

Que erro que ocorreu? Posta aí o erro e o seu código completo.

Abraço!

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure este é o erro.

codigos:

import org.junit.Test;

import br.com.caelum.leilao.builder.CriadorDeLeilao;
import br.com.caelum.leilao.dominio.Leilao;

public class EncerradorDeLeilaoTest {
     @Test
        public void deveEncerrarLeiloesQueComecaramUmaSemanaAtras() {

            Calendar antiga = Calendar.getInstance();
            antiga.set(1999, 1, 20);

            Leilao leilao1 = new CriadorDeLeilao().para("TV de plasma")
                .naData(antiga).constroi();
            Leilao leilao2 = new CriadorDeLeilao().para("Geladeira")
                .naData(antiga).constroi();

            RepositorioDeLeiloes daoFalso = mock(RepositorioDeLeiloes.class);
            when(daoFalso.correntes()).thenReturn(Arrays.asList(leilao1, leilao2));

            EncerradorDeLeilao encerrador = new EncerradorDeLeilao(daoFalso);
            encerrador.encerra();

            assertEquals(2, encerrador.getTotalEncerrados());
            assertTrue(leilao1.isEncerrado());
            assertTrue(leilao2.isEncerrado());
        }
}
//////////////////////////////////////
package br.com.caelum.leilao.servico;

import java.util.Calendar;
import java.util.List;

import br.com.caelum.leilao.dominio.Leilao;
import br.com.caelum.leilao.infra.dao.LeilaoDao;

public class EncerradorDeLeilao {

    private int total = 0;
    private final RepositorioDeLeiloes dao;

    public EncerradorDeLeilao(RepositorioDeLeiloes dao) {
            this.dao = dao;

    }
    public void encerra() {
        RepositorioDeLeiloes dao = new LeilaoDao();
        List<Leilao> todosLeiloesCorrentes = dao.correntes();

        for (Leilao leilao : todosLeiloesCorrentes) {
            if (comecouSemanaPassada(leilao)) {
                leilao.encerra();
                total++;
                dao.atualiza(leilao);
            }
        }
    }

    private boolean comecouSemanaPassada(Leilao leilao) {
        return diasEntre(leilao.getData(), Calendar.getInstance()) >= 7;
    }

    private int diasEntre(Calendar inicio, Calendar fim) {
        Calendar data = (Calendar) inicio.clone();
        int diasNoIntervalo = 0;
        while (data.before(fim)) {
            data.add(Calendar.DAY_OF_MONTH, 1);
            diasNoIntervalo++;
        }

        return diasNoIntervalo;
    }

    public int getTotalEncerrados() {
        return total;
    }
}
/////////////////////////////////////////
package br.com.caelum.leilao.servico;

import java.util.List;

import br.com.caelum.leilao.dominio.Leilao;

public interface RepositorioDeLeiloes {
     void salva(Leilao leilao);
        List<Leilao> encerrados();
        List<Leilao> correntes();
        void atualiza(Leilao leilao);
}
//////////////////////////////////

É um problema com seu banco de dados. Você tem a stacktrace completa? Confere se seus dados de conexão com o banco estão certinhos.

Abraço!

Bom dia Carla,

Consegui reproduzir o seu problema aqui e encontrei a solução. Primeiro vamos entender a exceção, ela reclama que não está encontrando um banco de dados chamado 'mocks', no código que temos, note que o construtor da classe LeilaoDao tenta conectar com esse banco, mas nesse curso não nos pediram para configurar um mysql local com o banco 'mocks'. Veja que o teste passa como parâmetro um mock do dao para o EncerradorDeLeiloes, logo ele não deveria nem tentar conectar com o banco certo? Mas veja a primeira linha do método encerra() do EncerradorDeLeiloes, ele cria um dao local chamando o construtor do LeilaoDao, é nesse momento que seu teste falha, a solução é utilizar o dao recebido como parâmetro no construtor. Como o nome do atributo é o mesmo da variável local, basta deletar essa linha e seus problemas estarão resolvidos ;).

Agora que vi que a sua exceção é um pouco diferente dá que eu reproduzi no meu computador com esse código.

Aqui a exceção foi:

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'mocks'
    at br.com.caelum.leilao.infra.dao.LeilaoDao.<init>(LeilaoDao.java:27)
    at br.com.caelum.leilao.servico.EncerradorDeLeilao.encerra(EncerradorDeLeilao.java:20)
    at br.com.caelum.leilao.servico.EncerradorDeLeilaoTest.deveEncerrarLeiloesQueInciaramAntesDaSemanaPassada(EncerradorDeLeilaoTest.java:40)
[...]

Aqui ele reclama que não encontrou o banco de dados 'mocks', significa que o dao conseguiu se conectar ao MySQL mas não encontrou o banco de dados desejado. No seu caso, o erro diz:

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

No meu computador eu tenho o mysql configurado e rodando, não sei como estão essas configurações na sua máquina. Se você realmente quiser se conectar ao banco esse link http://stackoverflow.com/questions/2983248/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-fai tem algumas possibilidades do que pode ser o problema.

Mas a solução continua a mesma, pois o teste nem devia tentar acessar o banco.

solução!

Oi Carla,

Vc está dando um RepositorioDeLeiloes dao = new LeilaoDao(); dento do mérodo encerra(). Ou seja, não está usando o mock! :)

Um abraço!

Muito obrigada pela ajuda pessoal. Consegui :)

Muito obrigada pela ajuda pessoal. Consegui :)

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