gpt4 book ai didi

java - JUnit、H2、JaxRS、在测试方法之间放置内存数据库

转载 作者:搜寻专家 更新时间:2023-11-01 00:56:24 25 4
gpt4 key购买 nike

如何在测试方法之间删除、删除、回滚或断开与我的 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();
}
}

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

也许我可以使用某种事务性注解?但是,我想知道如何使用相对普通的 jersey + JUnit 来做到这一点。

Jersey 是 2.12,Java 1.7,H2 是 1.4.181,JUnit 是 4.11。

版本是可以协商的。

最佳答案

我正在使用一个处理(重新)初始化的 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");
...

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

不要同时运行测试。

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

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

关于java - JUnit、H2、JaxRS、在测试方法之间放置内存数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com