2017-06-21 61 views
1

我正在編寫一些與數據庫交互的代碼的測試。我的代碼有一個嘗試捕獲,尋找BatchUpdateException。然而,在我的測試類中,我使用了內存數據庫(H2),並且當插入失敗時,它不會拋出BatchUpdateException。它拋出一個org.h2.jdbc.JdbcSQLExceptionjava需要h2數據庫來拋出jdbc異常

我希望能夠用Catch子句覆蓋測試用例。我該怎麼做呢?

+1

您使用的Java版本?如果它是7或以上,那麼您可以捕獲多個異常類型並使用相同的代碼處理它們:http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html – ManoDestra

回答

1

你不能只是讓你的測試代碼趕上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