package com.tddinaction.data.jdbc;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import com.mockobjects.sql.MockMultiRowResultSet;
import com.tddinaction.data.person.Person;
public class JdbcPersonDaoTest {
@Test
public void testFindByLastname() throws Exception {
DataSource datasource = createMock(DataSource.class);
Connection connection = createMock(Connection.class);
expect(datasource.getConnection()).andReturn(connection);
String sql = "SELECT * FROM people WHERE last_name = ?";
PreparedStatement stmt = createMock(PreparedStatement.class);
expect(connection.prepareStatement(sql)).andReturn(stmt);
stmt.setString(1, "Smith");
MockMultiRowResultSet resultset = new MockMultiRowResultSet();
String[] columns = new String[] { "first_name", "last_name" };
resultset.setupColumnNames(columns);
List<Person> smiths = createListOfPeopleWithLastname("Smith");
resultset.setupRows(asResultSetArray(smiths));
expect(stmt.executeQuery()).andReturn(resultset);
resultset.setExpectedCloseCalls(1);
stmt.close();
connection.close();
replay(datasource, connection, stmt);
JdbcPersonDao dao = new JdbcPersonDao();
dao.setDatasource(datasource);
List<Person> people = dao.findByLastname("Smith");
assertEquals(smiths, people);
verify(datasource, connection, stmt);
resultset.verify();
}
private List<Person> createListOfPeopleWithLastname(
String lastName) {
List<Person> expected = new ArrayList<Person>();
expected.add(new Person("Alice", lastName));
expected.add(new Person("Billy", lastName));
expected.add(new Person("Clark", lastName));
return expected;
}
private Object[][] asResultSetArray(List<Person> people) {
Object[][] array = new Object[people.size()][2];
for (int i = 0; i < array.length; i++) {
Person person = people.get(i);
array[i] = new Object[] { person.getFirstname(),
person.getLastname() };
}
return array;
}
}