@DirtyContext的替代品,用于在弹簧引导下使用内存数据库中的H2进行隔离的JUnit测试

问题描述

现在我在JUnit-Testclasses中使用@DirtiesContext(classMode=DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD),但是我认为这种方法是过度杀伤的方法,并且确实会增加不必要的工作量(和开销),因为将重新创建整个上下文在每个测试用例之前。我在注释@DirtiesContext中唯一需要做的就是,我的内存H2数据库应该为空,并在每种测试方法之前重新创建。有没有一种简单的方法可以自动使用新创建的空h2数据库启动每个测试用例?

PS:我认为,当应用程序将具有超过100个以上的表时,使用@Before注释的方法来手工清除数据库是不可扩展的。

当前代码示例:

测试类

@SpringBootTest
@ExtendWith(SpringExtension.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@ActiveProfiles("test")
@Slf4j
public class TestClass {

    @Test
    @DisplayName("Check if X is saved in database")
    public void doXTest() {
        // do tests etc isolated 
    }

    @SneakyThrows
    @Test
    @DisplayName("Do y")
    public void doYTestMethod() {
        // do test isolated with 
    }
}

application.yml

spring:
  datasource:
    url: jdbc:h2:mem:template-db
    driver-class-name: org.h2.Driver
    username: XXXXXXX
    password: XXXXXXX
    h2:
      console:
        enabled: true
        path: /h2-console
    jpa:
      database-platform: org.hibernate.dialect.H2Dialect

解决方法

您可以使用@Transactional注释测试类,这将导致每个测试将在一个事务中运行,该事务在每次测试后都会回滚。这应该使数据库表在每次测试后都处于干净的测试中,并且不必为每个测试重新创建数据库(因为它也相当昂贵)。

如果您使用的是@DataJpaTest,它已经带有@Transactional注释。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...