我正在进行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);
}
正如你所看到的,我正在使用我的服务层中的方法来创建条目和用户,如果我一个接一个地运行测试,没有问题,但是当我运行所有测试时,数据库不是返回1个项目,而是返回多个项目,所以发生了异常。
我需要在每次测试后清理h2数据库,可能需要@AfterEach注解,但是我的代码中没有和delete方法可以调用。我如何清理H2数据库?
3条答案
按热度按时间bqucvtff1#
除了@J Asgarov答案(如果您希望在每次测试之前和之后执行某些操作,请使用
spring-boot
)之外(更具体地说,在@Before
方法之前和@After
方法之后),您还可以使用@Sql
注解执行特定的sql
脚本,例如从测试资源中执行。这对于
sequences
来说可能很方便,因为他们不关心回滚。关于@Mark Bramnik提到的
@Transactional
要小心,因为事务跨越整个测试方法,所以您无法验证事务边界的正确性。von4xj4u2#
您提到了spring,看起来您正在测试DAO层,所以如果您使用junit4,我假设测试是使用SpringExtension/SpringRunner运行的。
在这种情况下,
你试过在测试方法上使用
@Transactional
吗?或者,如果所有的测试方法都是"事务性的",你可以把它放在一个测试类上一次。其工作原理如下:
如果一切都配置正确,spring将在测试开始前打开一个事务,并在测试结束后回滚该事务。
回滚应该自动清除插入的数据。
快速搜索一下this tutorial,肯定还有很多其他的
kr98yfug3#
默认情况下,注解测试类的
@JpaDataTest
将回滚每个测试https://www.baeldung.com/spring-jpa-test-in-memory-database