每次 junit 测试后如何清理 h2 db?
How to cleanup h2 db after each junit test?
我正在做 junit 测试,在每个测试用例之前添加一些用户。代码是:
@BeforeEach
void setUp() {
saveUser();
saveEntry();
}
@Test
void saveUser() {
User user = new User();
user.setUserId(null);
user.setUsername("John");
user.setEmail("john@foo.com");
user.setPassword("password");
userService.saveUser(user);
}
@Test
void saveEntry() {
Entry entry = new Entry();
entry.setText("test text");
entry.setUserId(1L);
entryService.saveEntry(entry);
}
如您所见,我正在使用服务层中的方法来创建条目和用户。如果我 运行 一个一个测试就没有问题。但是当我 运行 所有测试然后 db 不返回 1 个项目并返回多个项目所以发生异常。
我需要在每次测试后使用 @AfterEach 注释清理 h2 数据库,但我的代码中没有要调用的 delete 方法。如何清理 H2 数据库?
您提到了 spring,看起来您正在测试 DAO 层,所以如果您使用的是 junit 4,我假设测试是 运行 SpringExtension/SpringRunner。
在这种情况下,
你试过在测试方法上使用@Transactional
吗?或者,如果所有测试方法都是“事务性的”,您可以将其放在测试中一次 class.
其工作原理如下:
如果一切配置正确spring将在测试开始前打开一个事务,并在测试结束后回滚该事务。
回滚应该会自动清除插入的数据。
快速谷歌搜索显示this tutorial,肯定还有很多其他
@JpaDataTest
注释测试 class 将默认回滚每个测试
除了@J Asgarov 的正确答案之外,如果您想在每次测试之前和之后执行某些操作(更具体地说,在 @Before
之前和 [=13= 之后),请使用 spring-boot
] 方法)您可以使用 @Sql
注释来执行特定的 sql
脚本,例如来自测试资源的脚本。
@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class TestClass
}
它可能对 sequences
很方便,因为他们不关心回滚。
关于@Mark Bramnik 提到的 @Transactional
要小心,因为事务跨越整个测试方法,所以你无法验证事务边界的正确性。
我正在做 junit 测试,在每个测试用例之前添加一些用户。代码是:
@BeforeEach
void setUp() {
saveUser();
saveEntry();
}
@Test
void saveUser() {
User user = new User();
user.setUserId(null);
user.setUsername("John");
user.setEmail("john@foo.com");
user.setPassword("password");
userService.saveUser(user);
}
@Test
void saveEntry() {
Entry entry = new Entry();
entry.setText("test text");
entry.setUserId(1L);
entryService.saveEntry(entry);
}
如您所见,我正在使用服务层中的方法来创建条目和用户。如果我 运行 一个一个测试就没有问题。但是当我 运行 所有测试然后 db 不返回 1 个项目并返回多个项目所以发生异常。
我需要在每次测试后使用 @AfterEach 注释清理 h2 数据库,但我的代码中没有要调用的 delete 方法。如何清理 H2 数据库?
您提到了 spring,看起来您正在测试 DAO 层,所以如果您使用的是 junit 4,我假设测试是 运行 SpringExtension/SpringRunner。
在这种情况下,
你试过在测试方法上使用@Transactional
吗?或者,如果所有测试方法都是“事务性的”,您可以将其放在测试中一次 class.
其工作原理如下:
如果一切配置正确spring将在测试开始前打开一个事务,并在测试结束后回滚该事务。
回滚应该会自动清除插入的数据。
快速谷歌搜索显示this tutorial,肯定还有很多其他
@JpaDataTest
注释测试 class 将默认回滚每个测试
除了@J Asgarov 的正确答案之外,如果您想在每次测试之前和之后执行某些操作(更具体地说,在 @Before
之前和 [=13= 之后),请使用 spring-boot
] 方法)您可以使用 @Sql
注释来执行特定的 sql
脚本,例如来自测试资源的脚本。
@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class TestClass
}
它可能对 sequences
很方便,因为他们不关心回滚。
关于@Mark Bramnik 提到的 @Transactional
要小心,因为事务跨越整个测试方法,所以你无法验证事务边界的正确性。