JUnit,H2,JaxRS,在测试方法之间删除内存数据库

时间:2014-10-24 20:03:00

标签: java hibernate junit jersey jax-rs

如何在测试方法之间删除或删除或回滚H2数据库?

这是我的一些hibernate测试配置:

    <property name="connection.driver_class">org.h2.Driver</property>
    <property name="connection.url">
        jdbc:h2:mem:test;DB_CLOSE_DELAY=0;INIT=RUNSCRIPT FROM './h2-ext/add_to_date.sql'
    </property>
    <property name="hbm2ddl.auto">create</property>

我有一个基类,我将继承我的所有测试:

public abstract class BaseTest {

    @After
    public void drop() throws Exception {
        System.out.println("!!!!!! DROP !!!!!!&&&&&&&&&&&&&&&&&&&&&&");
        // this seems to do nothing
        //org.h2.store.fs.FileUtils.deleteRecursive("mem:test", true);
        //org.h2.store.fs.FileUtils.deleteRecursive("NoTellingwhatThisdoes", true);

        // the schema does not get recreated, it seems
        //Session sess = DB.sf.openSession();
        //sess.createSQLQuery("DROP ALL OBJECTS;").executeUpdate();

        // org.h2.jdbc.JdbcSQLException: Cannot truncate "PUBLIC.FOO";
        //Session sess = DB.sf.openSession();
        //sess.createSQLQuery("TRUNCATE TABLE FOO;").executeUpdate();
        //sess.createSQLQuery("TRUNCATE TABLE BAR;").executeUpdate();
    }
}

似乎应该有一种简单的方法来执行这样的集成测试?

也许我可以使用某种某种Transactional注释?但是,我想知道如何用相对香草的球衣+ JUnit做到这一点。

泽西岛是2.12,爪哇1.7,H2是1.4.181,JUnit是4.11。

版本可以协商。

1 个答案:

答案 0 :(得分:0)

我正在使用一个处理(重新)初始化的SQL文件。有了这样的文件,您可以使用:

import org.h2.tools.RunScript;

@Autowired
private DataSource dataSource;  // get your DataSource somehow

@Before
public void setup() {
    RunScript.execute(dataSource.getConnection(), new FileReader("src/test/resources/testdb/data.sql");
    ...

并且每次测试时数据库都会恢复正常。

但是不要并行运行测试。

一种不同的-也许是更好的方法:

  • 编写测试,以使数据库状态无关紧要,并且每个测试可以与其他测试及其自身并行运行。然后,您可以将这些测试用于负载测试。