2017-09-07 10 views
1

下面給我:有關使用H2與junit的一些說明?

org.h2.jdbc.JdbcSQLException:表 「foo」 存在; SQL 陳述

哪個讓我困惑,希望有幾個澄清。

H2服務器何時啓動/關閉,由getConnectionclose

爲什麼already exists會發生?當H2服務器啓動時,模式是否從以前的會話中保留下來?

有關在H2中設置測試模式和數據集以用於數據庫單元測試的任何最佳實踐建議?

public class MyTest { 
    @Before 
     public void setUp() throws ClassNotFoundException, SQLException { 
      try { 
        Class.forName("org.h2.Driver"); 
        Connection conn = DriverManager.getConnection("jdbc:h2:~/test;MODE=Oracle", "sa", ""); 
        // add application code here 


        Statement statement =conn.createStatement(); 
        statement.execute("create table foo (id integer)"); 
        conn.commit(); 

        ResultSet rs = statement.executeQuery("select * from foo"); 
        if (rs.next()) { 
          System.out.println(rs.getString("id")); 
        } 

        statement.execute("insert into foo (id) values (5)"); 
        conn.commit(); 

        rs = statement.executeQuery("select * from foo"); 
        if (rs.next()) { 
          System.out.println(rs.getString("id")); 
        } 


        conn.close(); 
      } catch (Throwable t) { 
       t.printStackTrace(); 
      } 

     } 


    @Test 
    public void test() { 

    } 
} 
+0

您沒有足夠的代碼示例來確定如何創建/銷燬H2數據庫。至少在運行所有單元測試之前和之後,應該創建和銷燬數據庫。你有「表已存在」錯誤的可能原因是你在每個單元測試之前創建表,如果你有多個單元測試,並且H2還沒有被銷燬(最可能不會),你最終會創建相同的錶針對相同的H2實例的多個時間表。嘗試將'@ Before'換成'@ BeforeClass'並將'setUp'設置爲靜態,看看你是否會遇到同樣的問題。 – tsolakp

+0

@tsolakp我排除的唯一代碼是一個空的測試方法,我已經更新了包含此代碼的問題。對@BeforeClass使用靜態設置方法不會產生任何更改。我很不清楚DB是如何被創建/銷燬的,它是由getConnection調用創建的嗎?不是由創建 – ab11

+0

的H2數據庫'getConnection'當JVM以運行單元測試開始時它會被創建。 – tsolakp

回答

4

問題是在這裏:

DriverManager.getConnection("jdbc:h2:~/test;MODE=Oracle", "sa", ""); 

連接字符串告訴H2使用文件系統存儲,$HOME/test下,所以毫不奇怪它堅持跨測試。

doc

嵌入式:
- jdbc:h2:~/test:在用戶的主目錄
'測試' - jdbc:h2:/data/test:在目錄/data

'測試' 在內存:
- jdbc:h2:mem:test一個進程中的多個連接
- jdbc:h2:mem:未命名的私人;一個連接

還有一個服務器模式,但是你沒有使用它,對於單元測試來說它沒有什麼意義。對於單元測試,根據您的測試設計,您可能需要兩種內存模式之一。

-1

H2是內存DB。但它實際上緩存了一些文件中的數據。你可以在你的項目中找到它們。

您可以使用DBUnit

希望這有助於

+1

不正確。 H2可以用作持久數據庫*或*作爲內存數據庫。見[正確答案由Hugues M.](https://stackoverflow.com/a/46105676/642706) –