spring 引导下的独立 JUnit 测试的 @DirtyContext 替代方案,内存数据库中有 H2

Alternative to @DirtyContext for isolated JUnit tests under spring boot with H2 in memory db

现在我在我的 JUnit 测试类中使用 @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 注释您的测试 class,这将导致每个测试都将 运行 在每次测试后回滚的事务中。这应该在每次测试后将数据库表留在干净的测试中,并且不需要 re-create 每次测试的数据库(因为它也相当昂贵)。

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