如何在每次junit测试后清理h2 db?

问题描述 投票:0回答:3

我正在进行 junit 测试,在每个测试用例之前添加一些用户。代码是:

@BeforeEach
    void setUp() {
        saveUser();
        saveEntry();
    }
    
    @Test
    void saveUser() {
        User user = new User();
        user.setUserId(null);
        user.setUsername("John");
        user.setEmail("[email protected]");
        user.setPassword("password");
        userService.saveUser(user);
    }

    @Test
    void saveEntry() {
        Entry entry = new Entry();
        entry.setText("test text");
        entry.setUserId(1L);
        entryService.saveEntry(entry);
    }

如您所见,我正在使用服务层中的方法来创建条目和用户。如果我一项一项地运行测试,就没有问题。但是当我运行所有测试时,数据库不会返回 1 个项目,而是返回多个项目,因此会发生异常。

我需要在每次测试后使用 @AfterEach 注释清理 h2 db,但我的代码中没有并删除要调用的方法。如何清理 H2 数据库?

java spring unit-testing junit h2
3个回答
5
投票

除了 @J Asgarov 答案之外,如果您想在每次测试之前和之后执行一些操作(更具体地说是在

spring-boot
之前和之后
@Before
方法之后),您可以使用
@After
注释,前提是您使用
@Sql
是正确的答案例如从测试资源执行特定的
sql
脚本。

@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class TestClass
}

这对于

sequences
来说可能很方便,因为他们不关心回滚。

关于@Mark Bramnik提到的

@Transactional
要小心,因为事务跨越整个测试方法,所以你无法验证事务边界的正确性。


0
投票

您提到了 spring,看起来您正在测试 DAO 层,因此如果您使用的是 junit 4,我假设测试正在使用 SpringExtension/SpringRunner 运行。

在这种情况下,

您是否尝试过在测试方法上使用

@Transactional
?或者,如果所有测试方法都是“事务性的”,您可以将其放置在测试类上一次。

其工作原理如下:

如果一切配置正确,spring将在测试开始之前打开一个事务,并在测试结束后回滚该事务。

回滚应该自动清理插入的数据。

快速谷歌搜索揭示了这个教程,肯定还有很多其他的


0
投票

@DataJpaTest
注释测试类将默认回滚每个测试

https://www.baeldung.com/spring-jpa-test-in-memory-database

© www.soinside.com 2019 - 2024. All rights reserved.