[RESOLVIDO] Mock retornando nulo

Pessoal,

Estou desenvolvendo uns teste utilizando JUnit e EasyMock, mas tem um determinado método que está dando erro. Aqui está o código de teste:

String sql;
Date data;
JDBCConnectionManager connectionManager;
final Connection conn;
PreparedStatement statement;
ResultSet rs;
FeriadosDAO feriadosDAO;
Collection<Feriado> feriados;
		
try{

	sql = JDBCProperties.SELECT_FERIADOS.getProperty();
			
	data = new Date();
			
	connectionManager = createMock(JDBCConnectionManager.class);
	conn = createMock(Connection.class);
	statement = createMock(PreparedStatement.class);
	rs = createMock(ResultSet.class);
		
	expect(connectionManager.getRiscoConnection()).andReturn(conn);
	expect(conn.prepareStatement(sql)).andReturn(statement);
	expect(statement.executeQuery()).andReturn(rs);
	expect(rs.next()).andReturn(false);
			
	feriadosDAO = new FeriadosDAOJDBC(connectionManager);
			
	feriados = feriadosDAO.getFeriados(data, data);
			
	assertTrue(feriados.isEmpty());
}
catch(DAOException exception){
	fail("DAOException lançada!");
}
catch(SQLException exception){
	fail("SQLException lançada!");
}

E este é o código que está sendo testado:

Collection<Feriado> feriados;
String sql;
Connection conn;
PreparedStatement statement;
ResultSet rs;
		
feriados = new ArrayList<Feriado>();
		
sql = JDBCProperties.SELECT_FERIADOS.getProperty();
		
try{
			
	conn = connectionManager.getRiscoConnection();
			
	statement = conn.prepareStatement(sql);
	statement.setDate(1, new java.sql.Date(dataInicial.getTime()));
	statement.setDate(2, new java.sql.Date(dataFinal.getTime()));
			
	rs = statement.executeQuery();
			
	while(rs.next()){
		feriados.add(new Feriado(rs.getDate("DATAFER")));
	}
			
	rs.close();
	statement.close();
	
	return feriados;
}
catch(SQLException exception){
	throw new DAOException(exception);
}

Quando executo o teste, ele falha dizendo que o objeto conn é nulo, e eu não estou entendendo, porque ele está sendo fornecido pelo mock do JDBCConnectionManager. O que estou fazendo de errado?

[quote=pango]Pessoal,

Estou desenvolvendo uns teste utilizando JUnit e EasyMock, mas tem um determinado método que está dando erro. Aqui está o código de teste:

String sql;
Date data;
JDBCConnectionManager connectionManager;
final Connection conn;
PreparedStatement statement;
ResultSet rs;
FeriadosDAO feriadosDAO;
Collection<Feriado> feriados;
		
try{

	sql = JDBCProperties.SELECT_FERIADOS.getProperty();
			
	data = new Date();
			
	connectionManager = createMock(JDBCConnectionManager.class);
	conn = createMock(Connection.class);
	statement = createMock(PreparedStatement.class);
	rs = createMock(ResultSet.class);
		
	expect(connectionManager.getRiscoConnection()).andReturn(conn);
	expect(conn.prepareStatement(sql)).andReturn(statement);
	expect(statement.executeQuery()).andReturn(rs);
	expect(rs.next()).andReturn(false);
			
	feriadosDAO = new FeriadosDAOJDBC(connectionManager);
			
	feriados = feriadosDAO.getFeriados(data, data);
			
	assertTrue(feriados.isEmpty());
}
catch(DAOException exception){
	fail("DAOException lançada!");
}
catch(SQLException exception){
	fail("SQLException lançada!");
}

E este é o código que está sendo testado:

Collection<Feriado> feriados;
String sql;
Connection conn;
PreparedStatement statement;
ResultSet rs;
		
feriados = new ArrayList<Feriado>();
		
sql = JDBCProperties.SELECT_FERIADOS.getProperty();
		
try{
			
	conn = connectionManager.getRiscoConnection();
			
	statement = conn.prepareStatement(sql);
	statement.setDate(1, new java.sql.Date(dataInicial.getTime()));
	statement.setDate(2, new java.sql.Date(dataFinal.getTime()));
			
	rs = statement.executeQuery();
			
	while(rs.next()){
		feriados.add(new Feriado(rs.getDate("DATAFER")));
	}
			
	rs.close();
	statement.close();
	
	return feriados;
}
catch(SQLException exception){
	throw new DAOException(exception);
}

Quando executo o teste, ele falha dizendo que o objeto conn é nulo, e eu não estou entendendo, porque ele está sendo fornecido pelo mock do JDBCConnectionManager. O que estou fazendo de errado?[/quote]

Acho que tá faltando o replay() nas classes mockadas.

Sugestão: Se você está testando pra decidir qual mockador usar, não deixe de experimentar esse: http://www.mockito.org/

É o melhor na minha opinião!

lavh,

Era isso mesmo mesmo, cara. Eu postei a mensagem aqui no GUJ e saí pra almoçar. No meio do almoço, a “lampadazinha” acendeu na minha cabeça. Por isso que é bom dar uma “voada” quando você não está conseguindo resolver um problema. :wink:

Um abraço!