1
我正在編寫一些與數據庫交互的代碼的測試。我的代碼有一個嘗試捕獲,尋找BatchUpdateException
。然而,在我的測試類中,我使用了內存數據庫(H2),並且當插入失敗時,它不會拋出BatchUpdateException。它拋出一個org.h2.jdbc.JdbcSQLException
。java需要h2數據庫來拋出jdbc異常
我希望能夠用Catch子句覆蓋測試用例。我該怎麼做呢?
我正在編寫一些與數據庫交互的代碼的測試。我的代碼有一個嘗試捕獲,尋找BatchUpdateException
。然而,在我的測試類中,我使用了內存數據庫(H2),並且當插入失敗時,它不會拋出BatchUpdateException。它拋出一個org.h2.jdbc.JdbcSQLException
。java需要h2數據庫來拋出jdbc異常
我希望能夠用Catch子句覆蓋測試用例。我該怎麼做呢?
你不能只是讓你的測試代碼趕上org.h2.jdbc.JdbcSQLException
,然後拋出一個新的java.sql.BatchUpdateException
?這似乎爲我工作...
package h2demo;
import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class H2DemoMain {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:test")) {
try (Statement st = conn.createStatement()) {
// set up test environment
st.execute("CREATE TABLE table1 (id INT PRIMARY KEY)");
st.execute("INSERT INTO table1 (id) VALUES (2)");
}
try {
doBatchUpdate(conn);
} catch (BatchUpdateException bue) {
System.out.println("BatchUpdateException caught: " + bue.getMessage());
System.out.println();
System.out.println("Update counts returned by exception:");
for (int i : bue.getUpdateCounts()) {
System.out.println(i);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
private static int[] doBatchUpdate(Connection conn) throws SQLException {
int[] updateCounts = null;
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO table1 (id) VALUES (?)")) {
ps.setInt(1, 1);
ps.addBatch();
ps.setInt(1, 2);
ps.addBatch();
ps.setInt(1, 3);
ps.addBatch();
updateCounts = ps.executeBatch();
} catch (org.h2.jdbc.JdbcSQLException jse) {
throw new BatchUpdateException(jse.getMessage(), updateCounts, jse);
}
return updateCounts;
}
}
...產生以下控制檯(System.out
)輸出:
BatchUpdateException caught: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.TABLE1(ID)"; SQL statement:
INSERT INTO table1 (id) VALUES (?) [23505-196]
Update counts returned by exception:
1
-3
1
您使用的Java版本?如果它是7或以上,那麼您可以捕獲多個異常類型並使用相同的代碼處理它們:http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html – ManoDestra