From f4e75deb0a01996003d384d5e44078231cee9e0d Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Wed, 3 Jun 2009 20:06:04 +0000 Subject: [PATCH] added some additional tests (SPR-3322, SPR-5162) --- .../jdbc/core/BatchUpdateTestHelper.java | 28 ++++++- .../NamedParameterJdbcTemplateTests.java | 78 ++++++++++++++++++- .../core/simple/SimpleJdbcTemplateTests.java | 41 +++++++++- 3 files changed, 141 insertions(+), 6 deletions(-) diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/BatchUpdateTestHelper.java b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/BatchUpdateTestHelper.java index e0ac783196f..4da3cd40bf3 100644 --- a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/BatchUpdateTestHelper.java +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/BatchUpdateTestHelper.java @@ -5,6 +5,7 @@ import java.sql.PreparedStatement; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.List; +import java.util.Map; import javax.sql.DataSource; import org.easymock.MockControl; @@ -17,7 +18,7 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource; */ public abstract class BatchUpdateTestHelper { - public static void prepareBatchUpdateMocks(String sqlToUse, Object ids, + public static void prepareBatchUpdateMocks(String sqlToUse, Object ids, int[] sqlTypes, int[] rowsAffected, MockControl ctrlDataSource, DataSource mockDataSource, MockControl ctrlConnection, Connection mockConnection, MockControl ctrlPreparedStatement, @@ -37,16 +38,37 @@ public abstract class BatchUpdateTestHelper { if (ids instanceof SqlParameterSource[]) { idLength = ((SqlParameterSource[])ids).length; } + else if (ids instanceof Map[]) { + idLength = ((Map[])ids).length; + } else { idLength = ((List)ids).size(); } for (int i = 0; i < idLength; i++) { if (ids instanceof SqlParameterSource[]) { - mockPreparedStatement.setObject(1, ((SqlParameterSource[])ids)[i].getValue("id")); + if (sqlTypes != null) { + mockPreparedStatement.setObject(1, ((SqlParameterSource[])ids)[i].getValue("id"), sqlTypes[0]); + } + else { + mockPreparedStatement.setObject(1, ((SqlParameterSource[])ids)[i].getValue("id")); + } + } + else if (ids instanceof Map[]) { + if (sqlTypes != null) { + mockPreparedStatement.setObject(1, ((Map[])ids)[i].get("id"), sqlTypes[0]); + } + else { + mockPreparedStatement.setObject(1, ((Map[])ids)[i].get("id")); + } } else { - mockPreparedStatement.setObject(1, ((Object[])((List)ids).get(i))[0]); + if (sqlTypes != null) { + mockPreparedStatement.setObject(1, ((Object[])((List)ids).get(i))[0], sqlTypes[0]); + } + else { + mockPreparedStatement.setObject(1, ((Object[])((List)ids).get(i))[0]); + } } ctrlPreparedStatement.setVoidCallable(); mockPreparedStatement.addBatch(); diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java index b35c123c59c..4716527a36d 100644 --- a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplateTests.java @@ -26,6 +26,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Collections; import javax.sql.DataSource; @@ -413,6 +414,43 @@ public class NamedParameterJdbcTemplateTests extends AbstractJdbcTests { assertTrue("Customer forename was assigned correctly", cust.getForename().equals("rod")); } + public void testBatchUpdateWithPlainMap() throws Exception { + + final String sqlToUse = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"; + final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id"; + final Map[] ids = new Map[2]; + ids[0] = Collections.singletonMap("id", 100); + ids[1] = Collections.singletonMap("id", 200); + final int[] rowsAffected = new int[] { 1, 2 }; + + MockControl ctrlDataSource = MockControl.createControl(DataSource.class); + DataSource mockDataSource = (DataSource) ctrlDataSource.getMock(); + MockControl ctrlConnection = MockControl.createControl(Connection.class); + Connection mockConnection = (Connection) ctrlConnection.getMock(); + MockControl ctrlPreparedStatement = MockControl.createControl(PreparedStatement.class); + PreparedStatement mockPreparedStatement = (PreparedStatement) ctrlPreparedStatement.getMock(); + MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class); + DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock(); + + BatchUpdateTestHelper.prepareBatchUpdateMocks(sqlToUse, ids, null, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, + mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData, + mockDatabaseMetaData); + + BatchUpdateTestHelper.replayBatchUpdateMocks(ctrlDataSource, ctrlConnection, ctrlPreparedStatement, ctrlDatabaseMetaData); + + JdbcTemplate template = new JdbcTemplate(mockDataSource, false); + NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(template); + + int[] actualRowsAffected = namedParameterJdbcTemplate.batchUpdate(sql, ids); + + assertTrue("executed 2 updates", actualRowsAffected.length == 2); + assertEquals(rowsAffected[0], actualRowsAffected[0]); + assertEquals(rowsAffected[1], actualRowsAffected[1]); + + BatchUpdateTestHelper.verifyBatchUpdateMocks(ctrlPreparedStatement, ctrlDatabaseMetaData); + + } + public void testBatchUpdateWithSqlParameterSource() throws Exception { final String sqlToUse = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"; @@ -431,7 +469,45 @@ public class NamedParameterJdbcTemplateTests extends AbstractJdbcTests { MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class); DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock(); - BatchUpdateTestHelper.prepareBatchUpdateMocks(sqlToUse, ids, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, + BatchUpdateTestHelper.prepareBatchUpdateMocks(sqlToUse, ids, null, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, + mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData, + mockDatabaseMetaData); + + BatchUpdateTestHelper.replayBatchUpdateMocks(ctrlDataSource, ctrlConnection, ctrlPreparedStatement, ctrlDatabaseMetaData); + + JdbcTemplate template = new JdbcTemplate(mockDataSource, false); + NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(template); + + int[] actualRowsAffected = namedParameterJdbcTemplate.batchUpdate(sql, ids); + + assertTrue("executed 2 updates", actualRowsAffected.length == 2); + assertEquals(rowsAffected[0], actualRowsAffected[0]); + assertEquals(rowsAffected[1], actualRowsAffected[1]); + + BatchUpdateTestHelper.verifyBatchUpdateMocks(ctrlPreparedStatement, ctrlDatabaseMetaData); + + } + + public void testBatchUpdateWithSqlParameterSourcePlusTypeInfo() throws Exception { + + final String sqlToUse = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"; + final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = :id"; + final SqlParameterSource[] ids = new SqlParameterSource[2]; + ids[0] = new MapSqlParameterSource().addValue("id", 100, Types.NUMERIC); + ids[1] = new MapSqlParameterSource().addValue("id", 200, Types.NUMERIC); + final int[] sqlTypes = new int[] {Types.NUMERIC}; + final int[] rowsAffected = new int[] { 1, 2 }; + + MockControl ctrlDataSource = MockControl.createControl(DataSource.class); + DataSource mockDataSource = (DataSource) ctrlDataSource.getMock(); + MockControl ctrlConnection = MockControl.createControl(Connection.class); + Connection mockConnection = (Connection) ctrlConnection.getMock(); + MockControl ctrlPreparedStatement = MockControl.createControl(PreparedStatement.class); + PreparedStatement mockPreparedStatement = (PreparedStatement) ctrlPreparedStatement.getMock(); + MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class); + DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock(); + + BatchUpdateTestHelper.prepareBatchUpdateMocks(sqlToUse, ids, sqlTypes, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData, mockDatabaseMetaData); diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/simple/SimpleJdbcTemplateTests.java b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/simple/SimpleJdbcTemplateTests.java index 89a9c62f95d..6e072e2ea1f 100644 --- a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/simple/SimpleJdbcTemplateTests.java +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/simple/SimpleJdbcTemplateTests.java @@ -21,6 +21,7 @@ import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.Types; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -540,7 +541,7 @@ public class SimpleJdbcTemplateTests extends TestCase { MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class); DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock(); - BatchUpdateTestHelper.prepareBatchUpdateMocks(sqlToUse, ids, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, + BatchUpdateTestHelper.prepareBatchUpdateMocks(sqlToUse, ids, null, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData, mockDatabaseMetaData); @@ -575,7 +576,7 @@ public class SimpleJdbcTemplateTests extends TestCase { MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class); DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock(); - BatchUpdateTestHelper.prepareBatchUpdateMocks(sql, ids, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, + BatchUpdateTestHelper.prepareBatchUpdateMocks(sql, ids, null, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData, mockDatabaseMetaData); @@ -593,4 +594,40 @@ public class SimpleJdbcTemplateTests extends TestCase { BatchUpdateTestHelper.verifyBatchUpdateMocks(ctrlPreparedStatement, ctrlDatabaseMetaData); } + public void testBatchUpdateWithListOfObjectArraysPlusTypeInfo() throws Exception { + + final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?"; + final List ids = new ArrayList(); + ids.add(new Object[] {100}); + ids.add(new Object[] {200}); + final int[] sqlTypes = new int[] {Types.NUMERIC}; + final int[] rowsAffected = new int[] { 1, 2 }; + + MockControl ctrlDataSource = MockControl.createControl(DataSource.class); + DataSource mockDataSource = (DataSource) ctrlDataSource.getMock(); + MockControl ctrlConnection = MockControl.createControl(Connection.class); + Connection mockConnection = (Connection) ctrlConnection.getMock(); + MockControl ctrlPreparedStatement = MockControl.createControl(PreparedStatement.class); + PreparedStatement mockPreparedStatement = (PreparedStatement) ctrlPreparedStatement.getMock(); + MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class); + DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock(); + + BatchUpdateTestHelper.prepareBatchUpdateMocks(sql, ids, sqlTypes, rowsAffected, ctrlDataSource, mockDataSource, ctrlConnection, + mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData, + mockDatabaseMetaData); + + BatchUpdateTestHelper.replayBatchUpdateMocks(ctrlDataSource, ctrlConnection, ctrlPreparedStatement, ctrlDatabaseMetaData); + + JdbcTemplate template = new JdbcTemplate(mockDataSource, false); + SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(template); + + int[] actualRowsAffected = simpleJdbcTemplate.batchUpdate(sql, ids, sqlTypes); + + assertTrue("executed 2 updates", actualRowsAffected.length == 2); + assertEquals(rowsAffected[0], actualRowsAffected[0]); + assertEquals(rowsAffected[1], actualRowsAffected[1]); + + BatchUpdateTestHelper.verifyBatchUpdateMocks(ctrlPreparedStatement, ctrlDatabaseMetaData); + } + }