EncerradorDeLeilao encerrador = new EncerradorDeLeilao(daoFalso); encerrador.encerra(); // ERRO!
EncerradorDeLeilao encerrador = new EncerradorDeLeilao(daoFalso); encerrador.encerra(); // ERRO!
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 failureNo 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.
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 :)