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

bvjveswy  于 2023-02-23  发布在  其他
关注(0)|答案(3)|浏览(292)

我正在进行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数据库?

bqucvtff

bqucvtff1#

除了@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要小心,因为事务跨越整个测试方法,所以您无法验证事务边界的正确性。

von4xj4u

von4xj4u2#

您提到了spring,看起来您正在测试DAO层,所以如果您使用junit4,我假设测试是使用SpringExtension/SpringRunner运行的。
在这种情况下,
你试过在测试方法上使用@Transactional吗?或者,如果所有的测试方法都是"事务性的",你可以把它放在一个测试类上一次。
其工作原理如下:
如果一切都配置正确,spring将在测试开始前打开一个事务,并在测试结束后回滚该事务。
回滚应该自动清除插入的数据。
快速搜索一下this tutorial,肯定还有很多其他的

kr98yfug

kr98yfug3#

默认情况下,注解测试类的@JpaDataTest将回滚每个测试
https://www.baeldung.com/spring-jpa-test-in-memory-database

相关问题