/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.jdbc.core;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.TestBean;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator;
/**
* @author Juergen Hoeller
* @since 02.08.2004
*/
public class RowMapperTests extends TestCase {
private final boolean debugEnabled = LogFactory.getLog(JdbcTemplate.class).isDebugEnabled();
private MockControl conControl;
private Connection con;
private MockControl rsControl;
private ResultSet rs;
private JdbcTemplate jdbcTemplate;
private List result;
protected void setUp() throws SQLException {
conControl = MockControl.createControl(Connection.class);
con = (Connection) conControl.getMock();
con.isClosed();
conControl.setDefaultReturnValue(false);
rsControl = MockControl.createControl(ResultSet.class);
rs = (ResultSet) rsControl.getMock();
rs.next();
rsControl.setReturnValue(true, 1);
rs.getString(1);
rsControl.setReturnValue("tb1", 1);
rs.getInt(2);
rsControl.setReturnValue(1, 1);
rs.next();
rsControl.setReturnValue(true, 1);
rs.getString(1);
rsControl.setReturnValue("tb2", 1);
rs.getInt(2);
rsControl.setReturnValue(2, 1);
rs.next();
rsControl.setReturnValue(false, 1);
rs.close();
rsControl.setVoidCallable(1);
rsControl.replay();
jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(new SingleConnectionDataSource(con, false));
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
jdbcTemplate.afterPropertiesSet();
}
public void testStaticQueryWithRowMapper() throws SQLException {
MockControl stmtControl = MockControl.createControl(Statement.class);
Statement stmt = (Statement) stmtControl.getMock();
con.createStatement();
conControl.setReturnValue(stmt, 1);
stmt.executeQuery("some SQL");
stmtControl.setReturnValue(rs, 1);
if (debugEnabled) {
stmt.getWarnings();
stmtControl.setReturnValue(null, 1);
}
stmt.close();
stmtControl.setVoidCallable(1);
conControl.replay();
stmtControl.replay();
result = jdbcTemplate.query("some SQL", new TestRowMapper());
stmtControl.verify();
verify();
}
public void testPreparedStatementCreatorWithRowMapper() throws SQLException {
MockControl psControl = MockControl.createControl(PreparedStatement.class);
final PreparedStatement ps = (PreparedStatement) psControl.getMock();
ps.executeQuery();
psControl.setReturnValue(rs, 1);
if (debugEnabled) {
ps.getWarnings();
psControl.setReturnValue(null, 1);
}
ps.close();
psControl.setVoidCallable(1);
conControl.replay();
psControl.replay();
result = jdbcTemplate.query(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
return ps;
}
}, new TestRowMapper());
psControl.verify();
verify();
}
public void testPreparedStatementSetterWithRowMapper() throws SQLException {
MockControl psControl = MockControl.createControl(PreparedStatement.class);
final PreparedStatement ps = (PreparedStatement) psControl.getMock();
con.prepareStatement("some SQL");
conControl.setReturnValue(ps, 1);
ps.setString(1, "test");
psControl.setVoidCallable(1);
ps.executeQuery();
psControl.setReturnValue(rs, 1);
if (debugEnabled) {
ps.getWarnings();
psControl.setReturnValue(null, 1);
}
ps.close();
psControl.setVoidCallable(1);
conControl.replay();
psControl.replay();
result = jdbcTemplate.query(
"some SQL",
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, "test");
}
}, new TestRowMapper());
psControl.verify();
verify();
}
public void testQueryWithArgsAndRowMapper() throws SQLException {
MockControl psControl = MockControl.createControl(PreparedStatement.class);
final PreparedStatement ps = (PreparedStatement) psControl.getMock();
con.prepareStatement("some SQL");
conControl.setReturnValue(ps, 1);
ps.setString(1, "test1");
ps.setString(2, "test2");
psControl.setVoidCallable(1);
ps.executeQuery();
psControl.setReturnValue(rs, 1);
if (debugEnabled) {
ps.getWarnings();
psControl.setReturnValue(null, 1);
}
ps.close();
psControl.setVoidCallable(1);
conControl.replay();
psControl.replay();
result = jdbcTemplate.query(
"some SQL",
new Object[] {"test1", "test2"},
new TestRowMapper());
psControl.verify();
verify();
}
public void testQueryWithArgsAndTypesAndRowMapper() throws SQLException {
MockControl psControl = MockControl.createControl(PreparedStatement.class);
final PreparedStatement ps = (PreparedStatement) psControl.getMock();
con.prepareStatement("some SQL");
conControl.setReturnValue(ps, 1);
ps.setString(1, "test1");
ps.setString(2, "test2");
psControl.setVoidCallable(1);
ps.executeQuery();
psControl.setReturnValue(rs, 1);
if (debugEnabled) {
ps.getWarnings();
psControl.setReturnValue(null, 1);
}
ps.close();
psControl.setVoidCallable(1);
conControl.replay();
psControl.replay();
result = jdbcTemplate.query(
"some SQL",
new Object[] {"test1", "test2"},
new int[] {Types.VARCHAR, Types.VARCHAR},
new TestRowMapper());
psControl.verify();
verify();
}
protected void verify() {
conControl.verify();
rsControl.verify();
assertTrue(result != null);
assertEquals(2, result.size());
TestBean tb1 = (TestBean) result.get(0);
TestBean tb2 = (TestBean) result.get(1);
assertEquals("tb1", tb1.getName());
assertEquals(1, tb1.getAge());
assertEquals("tb2", tb2.getName());
assertEquals(2, tb2.getAge());
}
private static class TestRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new TestBean(rs.getString(1), rs.getInt(2));
}
}
}