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 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.
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 :)