gpt4 book ai didi

java - 单元测试后的回滚顺序

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:54 27 4
gpt4 key购买 nike

我正在使用 spring-test 运行 JUnit 测试,我的代码如下所示:

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {})
@Transactional (propagation = Propagation.REQUIRED)
@Rollback
public class MyTest {

@Autowired
private MyRepository repository;

@Before
public void before() {
//clean repository
}

@Test
public void test_1() {
//add new entity
}

@Test
public void test_2() {
//add new entity
}
...
}

我想在所有测试之前回滚我的数据库状态。表会回滚,但 id 生成的顺序会随着每次测试而增加。

请帮助我找到在每次测试之前设置起始值序列的方法。

我正在使用 Spring、Hibernate、HsqlDb

最佳答案

如果您使用 @Transactional 调用方法,则无法进行回滚。您可以做的是 @After 以便删除所有数据库,并在 @Before 中再次创建它。我认为这不是一个好主意,您应该删除这些值以隔离每个测试。我建议您使用H2数据库,以便能够在内存存储中使用,这样您就不必担心id号。

您必须将此依赖项添加到 pom 中:

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>

.xml 中的配置应该是这样的:

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.url">jdbc:h2:mem:testDB;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1</property>
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="show_sql">false</property>
<property name="hbm2ddl.auto">create</property>
</session-factory>
</hibernate-configuration>

当然,您应该使其适应您的系统,但您必须保留该用户名和密码才能成功连接。

如果您不想自动创建表,您可以在连接 URL 上添加此参数:

INIT=RUNSCRIPT FROM 'classpath:scripts/create.sql

这将在测试之前运行您的脚本。

然后在你的测试中你可以做一些链接:

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {})
@Transactional (propagation = Propagation.REQUIRED)
public class MyTest {

@Autowired
private MyRepository repository;

@Test
public void test_1() {
//add new entity
}

@Test
public void test_2() {
//add new entity
}

@After
public void tearDown(){
repository.clean();
}
}

干净的方法可能是这样的

public void clean(){
for (T obj: this.findall()) //replacing T for the type if you don't use generics
session.delete(obj); //your entity manager or session, depending on how you do the queries
}

关于java - 单元测试后的回滚顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43494897/

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