added some additional tests (SPR-3322, SPR-5162)
This commit is contained in:
parent
0d5c9c1b75
commit
f4e75deb0a
|
|
@ -5,6 +5,7 @@ import java.sql.PreparedStatement;
|
||||||
import java.sql.DatabaseMetaData;
|
import java.sql.DatabaseMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
import org.easymock.MockControl;
|
import org.easymock.MockControl;
|
||||||
|
|
@ -17,7 +18,7 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||||
*/
|
*/
|
||||||
public abstract class BatchUpdateTestHelper {
|
public abstract class BatchUpdateTestHelper {
|
||||||
|
|
||||||
public static void prepareBatchUpdateMocks(String sqlToUse, Object ids,
|
public static void prepareBatchUpdateMocks(String sqlToUse, Object ids, int[] sqlTypes,
|
||||||
int[] rowsAffected,
|
int[] rowsAffected,
|
||||||
MockControl ctrlDataSource, DataSource mockDataSource, MockControl ctrlConnection, Connection mockConnection,
|
MockControl ctrlDataSource, DataSource mockDataSource, MockControl ctrlConnection, Connection mockConnection,
|
||||||
MockControl ctrlPreparedStatement,
|
MockControl ctrlPreparedStatement,
|
||||||
|
|
@ -37,16 +38,37 @@ public abstract class BatchUpdateTestHelper {
|
||||||
if (ids instanceof SqlParameterSource[]) {
|
if (ids instanceof SqlParameterSource[]) {
|
||||||
idLength = ((SqlParameterSource[])ids).length;
|
idLength = ((SqlParameterSource[])ids).length;
|
||||||
}
|
}
|
||||||
|
else if (ids instanceof Map[]) {
|
||||||
|
idLength = ((Map[])ids).length;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
idLength = ((List)ids).size();
|
idLength = ((List)ids).size();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < idLength; i++) {
|
for (int i = 0; i < idLength; i++) {
|
||||||
if (ids instanceof SqlParameterSource[]) {
|
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 {
|
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();
|
ctrlPreparedStatement.setVoidCallable();
|
||||||
mockPreparedStatement.addBatch();
|
mockPreparedStatement.addBatch();
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
|
|
@ -413,6 +414,43 @@ public class NamedParameterJdbcTemplateTests extends AbstractJdbcTests {
|
||||||
assertTrue("Customer forename was assigned correctly", cust.getForename().equals("rod"));
|
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 {
|
public void testBatchUpdateWithSqlParameterSource() throws Exception {
|
||||||
|
|
||||||
final String sqlToUse = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?";
|
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);
|
MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class);
|
||||||
DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock();
|
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,
|
mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData,
|
||||||
mockDatabaseMetaData);
|
mockDatabaseMetaData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import java.sql.Connection;
|
||||||
import java.sql.DatabaseMetaData;
|
import java.sql.DatabaseMetaData;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.Types;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
@ -540,7 +541,7 @@ public class SimpleJdbcTemplateTests extends TestCase {
|
||||||
MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class);
|
MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class);
|
||||||
DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock();
|
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,
|
mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData,
|
||||||
mockDatabaseMetaData);
|
mockDatabaseMetaData);
|
||||||
|
|
||||||
|
|
@ -575,7 +576,7 @@ public class SimpleJdbcTemplateTests extends TestCase {
|
||||||
MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class);
|
MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class);
|
||||||
DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock();
|
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,
|
mockConnection, ctrlPreparedStatement, mockPreparedStatement, ctrlDatabaseMetaData,
|
||||||
mockDatabaseMetaData);
|
mockDatabaseMetaData);
|
||||||
|
|
||||||
|
|
@ -593,4 +594,40 @@ public class SimpleJdbcTemplateTests extends TestCase {
|
||||||
BatchUpdateTestHelper.verifyBatchUpdateMocks(ctrlPreparedStatement, ctrlDatabaseMetaData);
|
BatchUpdateTestHelper.verifyBatchUpdateMocks(ctrlPreparedStatement, ctrlDatabaseMetaData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testBatchUpdateWithListOfObjectArraysPlusTypeInfo() throws Exception {
|
||||||
|
|
||||||
|
final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?";
|
||||||
|
final List<Object[]> ids = new ArrayList<Object[]>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue