有关使用H2和junit的一些说明?

时间:2017-09-07 15:48:08

标签: java

以下给我:

  

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() {

    }
}

2 个答案:

答案 0 :(得分: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 :(得分:-1)

H2是内存DB中的一个。但它实际上缓存了一些文件中的数据。您可以在项目中找到它们。

您可以使用DBUnit

希望这有帮助