2017-06-21 57 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