问题描述
现在我在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
注释。