📄 jdbctemplatetests.java
字号:
ctrlPreparedStatement.verify();
ctrlDatabaseMetaData.verify();
}
public void testCouldntGetConnectionOrExceptionTranslator() throws SQLException {
SQLException sex = new SQLException("foo", "07xxx");
ctrlDataSource = MockControl.createControl(DataSource.class);
mockDataSource = (DataSource) ctrlDataSource.getMock();
mockDataSource.getConnection();
// Expect two calls (one call after caching data product name): make get metadata fail also
ctrlDataSource.setThrowable(sex, 2);
replay();
try {
JdbcTemplate template = new JdbcTemplate(mockDataSource, false);
RowCountCallbackHandler rcch = new RowCountCallbackHandler();
template.query("SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3", rcch);
fail("Shouldn't have executed query without a connection");
}
catch (CannotGetJdbcConnectionException ex) {
// pass
assertTrue("Check root cause", ex.getCause() == sex);
}
ctrlDataSource.verify();
}
public void testCouldntGetConnectionForOperationOrExceptionTranslator() throws SQLException {
SQLException sex = new SQLException("foo", "07xxx");
// Change behavior in setUp() because we only expect one call to getConnection():
// none is necessary to get metadata for exception translator
ctrlDataSource = MockControl.createControl(DataSource.class);
mockDataSource = (DataSource) ctrlDataSource.getMock();
mockDataSource.getConnection();
// Expect two calls (one call after caching data product name): make get Metadata fail also
ctrlDataSource.setThrowable(sex, 2);
replay();
try {
JdbcTemplate template = new JdbcTemplate(mockDataSource, false);
RowCountCallbackHandler rcch = new RowCountCallbackHandler();
template.query("SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3", rcch);
fail("Shouldn't have executed query without a connection");
}
catch (CannotGetJdbcConnectionException ex) {
// pass
assertTrue("Check root cause", ex.getCause() == sex);
}
ctrlDataSource.verify();
}
public void testCouldntGetConnectionForOperationWithLazyExceptionTranslator() throws SQLException {
SQLException sex = new SQLException("foo", "07xxx");
ctrlDataSource = MockControl.createControl(DataSource.class);
mockDataSource = (DataSource) ctrlDataSource.getMock();
mockDataSource.getConnection();
ctrlDataSource.setThrowable(sex, 1);
replay();
try {
JdbcTemplate template2 = new JdbcTemplate();
template2.setDataSource(mockDataSource);
template2.afterPropertiesSet();
RowCountCallbackHandler rcch = new RowCountCallbackHandler();
template2.query("SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3", rcch);
fail("Shouldn't have executed query without a connection");
}
catch (CannotGetJdbcConnectionException ex) {
// pass
assertTrue("Check root cause", ex.getCause() == sex);
}
ctrlDataSource.verify();
}
/**
* Verify that afterPropertiesSet invokes exception translator.
*/
public void testCouldntGetConnectionInOperationWithExceptionTranslatorInitialized() throws SQLException {
SQLException sex = new SQLException("foo", "07xxx");
ctrlDataSource = MockControl.createControl(DataSource.class);
mockDataSource = (DataSource) ctrlDataSource.getMock();
//mockConnection.getMetaData();
//ctrlConnection.setReturnValue(null, 1);
//mockConnection.close();
//ctrlConnection.setVoidCallable(1);
ctrlConnection.replay();
// Change behaviour in setUp() because we only expect one call to getConnection():
// none is necessary to get metadata for exception translator
ctrlDataSource = MockControl.createControl(DataSource.class);
mockDataSource = (DataSource) ctrlDataSource.getMock();
// Upfront call for metadata - no longer the case
//mockDataSource.getConnection();
//ctrlDataSource.setReturnValue(mockConnection, 1);
// One call for operation
mockDataSource.getConnection();
ctrlDataSource.setThrowable(sex, 2);
ctrlDataSource.replay();
try {
JdbcTemplate template = new JdbcTemplate(mockDataSource, false);
RowCountCallbackHandler rcch = new RowCountCallbackHandler();
template.query("SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3", rcch);
fail("Shouldn't have executed query without a connection");
}
catch (CannotGetJdbcConnectionException ex) {
// pass
assertTrue("Check root cause", ex.getCause() == sex);
}
ctrlDataSource.verify();
ctrlConnection.verify();
}
public void testCouldntGetConnectionInOperationWithExceptionTranslatorInitializedViaBeanProperty()
throws Exception {
doTestCouldntGetConnectionInOperationWithExceptionTranslatorInitialized(true);
}
public void testCouldntGetConnectionInOperationWithExceptionTranslatorInitializedInAfterPropertiesSet()
throws Exception {
doTestCouldntGetConnectionInOperationWithExceptionTranslatorInitialized(false);
}
/**
* If beanProperty is true, initialize via exception translator bean property;
* if false, use afterPropertiesSet().
*/
private void doTestCouldntGetConnectionInOperationWithExceptionTranslatorInitialized(boolean beanProperty)
throws SQLException {
SQLException sex = new SQLException("foo", "07xxx");
ctrlConnection = MockControl.createControl(Connection.class);
mockConnection = (Connection) ctrlConnection.getMock();
//mockConnection.getMetaData();
//ctrlConnection.setReturnValue(null, 1);
//mockConnection.close();
//ctrlConnection.setVoidCallable(1);
ctrlConnection.replay();
// Change behaviour in setUp() because we only expect one call to getConnection():
// none is necessary to get metadata for exception translator
ctrlDataSource = MockControl.createControl(DataSource.class);
mockDataSource = (DataSource) ctrlDataSource.getMock();
// Upfront call for metadata - no longer the case
//mockDataSource.getConnection();
//ctrlDataSource.setReturnValue(mockConnection, 1);
// One call for operation
mockDataSource.getConnection();
ctrlDataSource.setThrowable(sex, 2);
ctrlDataSource.replay();
try {
JdbcTemplate template2 = new JdbcTemplate();
template2.setDataSource(mockDataSource);
template2.setLazyInit(false);
if (beanProperty) {
// This will get a connection.
template2.setExceptionTranslator(new SQLErrorCodeSQLExceptionTranslator(mockDataSource));
}
else {
// This will cause creation of default SQL translator.
// Note that only call should be effective.
template2.afterPropertiesSet();
template2.afterPropertiesSet();
}
RowCountCallbackHandler rcch = new RowCountCallbackHandler();
template2.query(
"SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3",
rcch);
fail("Shouldn't have executed query without a connection");
}
catch (CannotGetJdbcConnectionException ex) {
// pass
assertTrue("Check root cause", ex.getCause() == sex);
}
ctrlDataSource.verify();
ctrlConnection.verify();
}
public void testPreparedStatementSetterSucceeds() throws Exception {
final String sql = "UPDATE FOO SET NAME=? WHERE ID = 1";
final String name = "Gary";
int expectedRowsUpdated = 1;
MockControl ctrlPreparedStatement =
MockControl.createControl(PreparedStatement.class);
PreparedStatement mockPreparedStatement =
(PreparedStatement) ctrlPreparedStatement.getMock();
mockPreparedStatement.setString(1, name);
ctrlPreparedStatement.setVoidCallable();
mockPreparedStatement.executeUpdate();
ctrlPreparedStatement.setReturnValue(expectedRowsUpdated);
mockPreparedStatement.getWarnings();
ctrlPreparedStatement.setReturnValue(null);
mockPreparedStatement.close();
ctrlPreparedStatement.setVoidCallable();
mockConnection.prepareStatement(sql);
ctrlConnection.setReturnValue(mockPreparedStatement);
ctrlPreparedStatement.replay();
replay();
PreparedStatementSetter pss = new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, name);
}
};
int actualRowsUpdated =
new JdbcTemplate(mockDataSource).update(sql, pss);
assertTrue(
"updated correct # of rows",
actualRowsUpdated == expectedRowsUpdated);
ctrlPreparedStatement.verify();
}
public void testPreparedStatementSetterFails() throws Exception {
final String sql = "UPDATE FOO SET NAME=? WHERE ID = 1";
final String name = "Gary";
SQLException sex = new SQLException();
MockControl ctrlPreparedStatement =
MockControl.createControl(PreparedStatement.class);
PreparedStatement mockPreparedStatement =
(PreparedStatement) ctrlPreparedStatement.getMock();
mockPreparedStatement.setString(1, name);
ctrlPreparedStatement.setVoidCallable();
mockPreparedStatement.executeUpdate();
ctrlPreparedStatement.setThrowable(sex);
mockPreparedStatement.close();
ctrlPreparedStatement.setVoidCallable();
mockConnection.prepareStatement(sql);
ctrlConnection.setReturnValue(mockPreparedStatement);
ctrlPreparedStatement.replay();
replay();
PreparedStatementSetter pss = new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, name);
}
};
try {
new JdbcTemplate(mockDataSource).update(sql, pss);
fail("Should have failed with SQLException");
}
catch (DataAccessException ex) {
assertTrue("root cause was preserved", ex.getCause() == sex);
}
ctrlPreparedStatement.verify();
}
public void testCouldntClose() throws Exception {
MockControl ctrlStatement = MockControl.createControl(Statement.class);
Statement mockStatement = (Statement) ctrlStatement.getMock();
MockControl ctrlResultSet = MockControl.createControl(ResultSet.class);
ResultSet mockResultSet = (ResultSet) ctrlResultSet.getMock();
mockConnection.createStatement();
ctrlConnection.setReturnValue(mockStatement);
String sql = "SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3";
mockStatement.executeQuery(sql);
ctrlStatement.setReturnValue(mockResultSet);
mockResultSet.next();
ctrlResultSet.setReturnValue(false);
SQLException sex = new SQLException("bar");
mockResultSet.close();
ctrlResultSet.setThrowable(sex);
mockStatement.getWarnings();
ctrlStatement.setReturnValue(null);
mockStatement.close();
ctrlStatement.setThrowable(sex);
mockConnection.close();
ctrlConnection.setThrowable(sex);
ctrlStatement.replay();
ctrlResultSet.replay();
replay();
JdbcTemplate template2 = new JdbcTemplate(mockDataSource);
RowCountCallbackHandler rcch = new RowCountCallbackHandler();
template2.query("SELECT ID, FORENAME FROM CUSTMR WHERE ID < 3", rcch);
ctrlStatement.verify();
ctrlResultSet.verify();
}
/**
* Mock objects allow us to produce warnings at will
*/
public void testFatalWarning() throws Exception {
String sql = "SELECT forename from custmr";
SQLWarning warnings = new SQLWarning("My warning");
MockControl ctrlResultSet = MockControl.createControl(ResultSet.class);
ResultSet mockResultSet = (ResultSet) ctrlResultSet.getMock();
mockResultSet.next();
ctrlResultSet.setReturnValue(false);
mockResultSet.close();
ctrlResultSet.setVoidCallable();
MockControl ctrlStatement = MockControl.createControl(PreparedStatement.class);
PreparedStatement mockStatement = (PreparedStatement) ctrlStatement.getMock();
mockStatement.executeQuery(sql);
ctrlStatement.setReturnValue(mockResultSet);
mockStatement.getWarnings();
ctrlStatement.setReturnValue(warnings);
mockStatement.close();
ctrlStatement.setVoidCallable();
mockConnection.createStatement();
ctrlConnection.setReturnValue(mockStatement);
ctrlResultSet.replay();
ctrlStatement.replay();
replay();
JdbcTemplate t = new JdbcTemplate(mockDataSource);
t.setIgnoreWarnings(false);
try {
t.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
rs.getByte(1);
}
});
fail("Should have thrown exception on warning");
}
catch (SQLWarningException ex) {
// Pass
assertTrue(
"Root cause of warning was correct",
ex.getCause() == warnings);
}
ctrlResultSet.verify();
ctrlStatement.verify();
}
public void testIgnoredWarning() throws Exception {
String sql = "SELECT forename from custmr";
SQLWarning warnings = new SQLWarning("My warning");
MockControl ctrlResultSet = MockControl.createControl(ResultSet.class);
ResultSet mockResultSet = (ResultSet) ctrlResultSet.getMock();
mockResultSet.next();
ctrlResultSet.setReturnValue(false);
mockResultSet.close();
ctrlResultSet.setVoidCallable();
MockControl ctrlStatement =
MockControl.createControl(PreparedStatement.class);
PreparedStatement mockStatement =
(PreparedStatement) ctrlStatement.getMock();
mockStatement.executeQuery(sql);
ctrlStatement.setReturnValue(mockResultSet);
mockStatement.getWarnings();
ctrlStatement.setReturnValue(warnings);
mockStatement.close();
ctrlStatement.setVoidCallable();
mockConnection.createStatement();
ctrlConnection.setReturnValue(mockStatement);
ctrlResultSet.replay();
ctrlStatement.replay();
replay();
// Too long: truncation
JdbcTemplate template = new JdbcTemplate(mockDataSource);
template.setIgnoreWarnings(true);
template.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs)
throws java.sql.SQLException {
rs.getByte(1);
}
});
ctrlResultSet.verify();
ctrlStatement.verify();
}
public void testSQLErrorCodeTranslation() throws Exception {
final SQLException sex = new SQLException("I have a known problem", "99999", 1054);
final String sql = "SELECT ID FROM CUSTOMER";
MockControl ctrlResultSet = MockControl.createControl(ResultSet.class);
ResultSet mockResultSet = (ResultSet) ctrlResultSet.getMock();
mockResultSet.next();
ctrlResultSet.setReturnValue(true);
mockResultSet.close();
ctrlResultSet.setVoidCallable();
MockControl ctrlStatement = MockControl.createControl(PreparedStatement.class);
PreparedStatement mockStatement = (PreparedStatement) ctrlStatement.getMock();
mockStatement.executeQuery(sql);
ctrlStatement.setReturnValue(mockResultSet);
mockStatement.close();
ctrlStatement.setVoidCallable();
MockControl ctrlDatabaseMetaData = MockControl.createControl(DatabaseMetaData.class);
DatabaseMetaData mockDatabaseMetaData = (DatabaseMetaData) ctrlDatabaseMetaData.getMock();
mockDatabaseMetaData.getDatabaseProductName();
ctrlDatabaseMetaData.setReturnValue("MySQL");
mockConnection.createStatement();
ctrlConnection.setReturnValue(mockStatement);
mockConnection.getMetaData();
ctrlConnection.setReturnValue(mockDatabaseMetaData);
ctrlResultSet.replay();
ctrlStatement.replay();
ctrlDatabaseMetaData.replay();
replay();
JdbcTemplate template = new JdbcTemplate(mockDataSource);
try {
template.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
throw sex;
}
});
fail("Should have thrown BadSqlGrammarException");
}
catch (BadSqlGrammarException ex) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -