下面給我:有關使用H2與junit的一些說明?
org.h2.jdbc.JdbcSQLException:表 「foo」 存在; SQL 陳述
哪個讓我困惑,希望有幾個澄清。
H2服務器何時啓動/關閉,由getConnection
和close
?
爲什麼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() {
}
}
您沒有足夠的代碼示例來確定如何創建/銷燬H2數據庫。至少在運行所有單元測試之前和之後,應該創建和銷燬數據庫。你有「表已存在」錯誤的可能原因是你在每個單元測試之前創建表,如果你有多個單元測試,並且H2還沒有被銷燬(最可能不會),你最終會創建相同的錶針對相同的H2實例的多個時間表。嘗試將'@ Before'換成'@ BeforeClass'並將'setUp'設置爲靜態,看看你是否會遇到同樣的問題。 – tsolakp
@tsolakp我排除的唯一代碼是一個空的測試方法,我已經更新了包含此代碼的問題。對@BeforeClass使用靜態設置方法不會產生任何更改。我很不清楚DB是如何被創建/銷燬的,它是由getConnection調用創建的嗎?不是由創建 – ab11
的H2數據庫'getConnection'當JVM以運行單元測試開始時它會被創建。 – tsolakp