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
注释。
现在我在我的 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
注释。