首页 > 解决方案 > 每次junit测试后如何清理h2 db?

问题描述

我正在做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 db,但我的代码中没有和 delete 方法来调用。如何清理 H2 数据库?

标签: javaspringunit-testingjunith2

解决方案


除了正确的@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,因为他们不关心回滚。

关于@Transactional@Mark Bramnik 提到的要小心,因为事务跨越整个测试方法,因此您无法验证事务边界的正确性。


推荐阅读