mirror of
https://github.com/spring-projects/spring-framework
synced 2026-06-08 17:33:33 +00:00
added a config property to control defaulting of primitive property when receiving null value from result (SPR-5588)
This commit is contained in:
+82
@@ -46,6 +46,8 @@ public abstract class AbstractRowMapperTests extends TestCase {
|
||||
|
||||
protected MockControl conControl;
|
||||
protected Connection con;
|
||||
protected MockControl conControl2;
|
||||
protected Connection con2;
|
||||
protected MockControl rsmdControl;
|
||||
protected ResultSetMetaData rsmd;
|
||||
protected MockControl rsControl;
|
||||
@@ -53,6 +55,13 @@ public abstract class AbstractRowMapperTests extends TestCase {
|
||||
protected MockControl stmtControl;
|
||||
protected Statement stmt;
|
||||
protected JdbcTemplate jdbcTemplate;
|
||||
protected MockControl rsmdControl2;
|
||||
protected ResultSetMetaData rsmd2;
|
||||
protected MockControl rsControl2;
|
||||
protected ResultSet rs2;
|
||||
protected MockControl stmtControl2;
|
||||
protected Statement stmt2;
|
||||
protected JdbcTemplate jdbcTemplate2;
|
||||
|
||||
protected void setUp() throws SQLException {
|
||||
conControl = MockControl.createControl(Connection.class);
|
||||
@@ -110,13 +119,75 @@ public abstract class AbstractRowMapperTests extends TestCase {
|
||||
stmt.close();
|
||||
stmtControl.setVoidCallable(1);
|
||||
|
||||
conControl2 = MockControl.createControl(Connection.class);
|
||||
con2 = (Connection) conControl2.getMock();
|
||||
con2.isClosed();
|
||||
conControl2.setDefaultReturnValue(false);
|
||||
|
||||
rsmdControl2 = MockControl.createControl(ResultSetMetaData.class);
|
||||
rsmd2 = (ResultSetMetaData)rsmdControl2.getMock();
|
||||
rsmd2.getColumnCount();
|
||||
rsmdControl2.setReturnValue(4, 2);
|
||||
rsmd2.getColumnLabel(1);
|
||||
rsmdControl2.setReturnValue("name", 2);
|
||||
rsmd2.getColumnLabel(2);
|
||||
rsmdControl2.setReturnValue("age", 2);
|
||||
rsmd2.getColumnLabel(3);
|
||||
rsmdControl2.setReturnValue("birth_date", 1);
|
||||
rsmd2.getColumnLabel(4);
|
||||
rsmdControl2.setReturnValue("balance", 1);
|
||||
rsmdControl2.replay();
|
||||
|
||||
rsControl2 = MockControl.createControl(ResultSet.class);
|
||||
rs2 = (ResultSet) rsControl2.getMock();
|
||||
rs2.getMetaData();
|
||||
rsControl2.setReturnValue(rsmd2, 2);
|
||||
rs2.next();
|
||||
rsControl2.setReturnValue(true, 2);
|
||||
rs2.getString(1);
|
||||
rsControl2.setReturnValue("Bubba", 2);
|
||||
rs2.wasNull();
|
||||
rsControl2.setReturnValue(true, 2);
|
||||
rs2.getLong(2);
|
||||
rsControl2.setReturnValue(0, 2);
|
||||
rs2.getTimestamp(3);
|
||||
rsControl2.setReturnValue(new Timestamp(1221222L), 1);
|
||||
rs2.getBigDecimal(4);
|
||||
rsControl2.setReturnValue(new BigDecimal("1234.56"), 1);
|
||||
rs2.next();
|
||||
rsControl2.setReturnValue(false, 1);
|
||||
rs2.close();
|
||||
rsControl2.setVoidCallable(2);
|
||||
rsControl2.replay();
|
||||
|
||||
stmtControl2 = MockControl.createControl(Statement.class);
|
||||
stmt2 = (Statement) stmtControl2.getMock();
|
||||
|
||||
con2.createStatement();
|
||||
conControl2.setReturnValue(stmt2, 2);
|
||||
stmt2.executeQuery("select name, null as age, birth_date, balance from people");
|
||||
stmtControl2.setReturnValue(rs2, 2);
|
||||
if (debugEnabled) {
|
||||
stmt2.getWarnings();
|
||||
stmtControl2.setReturnValue(null, 2);
|
||||
}
|
||||
stmt2.close();
|
||||
stmtControl2.setVoidCallable(2);
|
||||
|
||||
conControl.replay();
|
||||
stmtControl.replay();
|
||||
conControl2.replay();
|
||||
stmtControl2.replay();
|
||||
|
||||
jdbcTemplate = new JdbcTemplate();
|
||||
jdbcTemplate.setDataSource(new SingleConnectionDataSource(con, false));
|
||||
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
|
||||
jdbcTemplate.afterPropertiesSet();
|
||||
|
||||
jdbcTemplate2 = new JdbcTemplate();
|
||||
jdbcTemplate2.setDataSource(new SingleConnectionDataSource(con2, false));
|
||||
jdbcTemplate2.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
|
||||
jdbcTemplate2.afterPropertiesSet();
|
||||
}
|
||||
|
||||
protected void verifyPerson(Person bean) {
|
||||
@@ -127,6 +198,17 @@ public abstract class AbstractRowMapperTests extends TestCase {
|
||||
assertEquals(new BigDecimal("1234.56"), bean.getBalance());
|
||||
}
|
||||
|
||||
protected void verifyPersonWithZeroAge(Person bean) {
|
||||
conControl2.verify();
|
||||
rsControl2.verify();
|
||||
rsmdControl2.verify();
|
||||
stmtControl2.verify();
|
||||
assertEquals("Bubba", bean.getName());
|
||||
assertEquals(0L, bean.getAge());
|
||||
assertEquals(new java.util.Date(1221222L), bean.getBirth_date());
|
||||
assertEquals(new BigDecimal("1234.56"), bean.getBalance());
|
||||
}
|
||||
|
||||
protected void verifyConcretePerson(ConcretePerson bean) {
|
||||
verify();
|
||||
assertEquals("Bubba", bean.getName());
|
||||
|
||||
+19
@@ -23,6 +23,7 @@ import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||
import org.springframework.jdbc.core.test.ConcretePerson;
|
||||
import org.springframework.jdbc.core.test.ExtendedPerson;
|
||||
import org.springframework.jdbc.core.test.Person;
|
||||
import org.springframework.beans.TypeMismatchException;
|
||||
|
||||
/**
|
||||
* @author Thomas Risberg
|
||||
@@ -89,4 +90,22 @@ public class BeanPropertyRowMapperTests extends AbstractRowMapperTests {
|
||||
}
|
||||
}
|
||||
|
||||
public void testMappingNullValue() throws SQLException {
|
||||
BeanPropertyRowMapper mapper = new BeanPropertyRowMapper(Person.class);
|
||||
try {
|
||||
List result1 = jdbcTemplate2.query("select name, null as age, birth_date, balance from people",
|
||||
mapper);
|
||||
fail("Should have thrown TypeMismatchException because of null value");
|
||||
}
|
||||
catch (TypeMismatchException ex) {
|
||||
// expected
|
||||
}
|
||||
mapper.setPrimitivesDefaultedForNullValue(true);
|
||||
List result2 = jdbcTemplate2.query("select name, null as age, birth_date, balance from people",
|
||||
mapper);
|
||||
assertEquals(1, result2.size());
|
||||
Person bean = (Person) result2.get(0);
|
||||
verifyPersonWithZeroAge(bean);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user