Java 替代@DirtyContext,用于spring引导下的独立JUnit测试,内存数据库中有H2
现在我在JUnit测试类中使用了Java 替代@DirtyContext,用于spring引导下的独立JUnit测试,内存数据库中有H2,java,spring-boot,junit,spring-test,Java,Spring Boot,Junit,Spring Test,现在我在JUnit测试类中使用了@DirtiesContext(classMode=DirtiesContext.classMode.BEFORE\u EACH\u TEST\u METHOD),但我认为这种方法是一种过火的方法,而且确实增加了比需要更多的工作负载(和开销),因为在每个测试用例之前都会重新创建整个上下文。从注释@DirtiesContext中我需要做的唯一一件事是,我的内存H2数据库应该是空的,并在每个测试方法之前重新创建。有没有一种简单的方法可以用新创建的空h2数据库自动启动每
@DirtiesContext(classMode=DirtiesContext.classMode.BEFORE\u EACH\u TEST\u METHOD)
,但我认为这种方法是一种过火的方法,而且确实增加了比需要更多的工作负载(和开销),因为在每个测试用例之前都会重新创建整个上下文。从注释@DirtiesContext
中我需要做的唯一一件事是,我的内存H2数据库应该是空的,并在每个测试方法之前重新创建。有没有一种简单的方法可以用新创建的空h2数据库自动启动每个测试用例
PS:我认为当应用程序增长到超过100个表时,手动清除数据库的@Before
注释方法是不可伸缩的
当前代码示例:
Testclass
application.yml
您可以使用
@Transactional
注释您的测试类,这将导致每个测试将在每个测试后回滚的事务中运行。这应该在每次测试后将数据库表保留在一个干净的测试中,并且不需要为每次测试重新创建数据库(因为这也相当昂贵)
如果您使用的是
@DataJpaTest
,这已经附带了@Transactional
注释。谢谢您的回答!但是使用@Transactional
,这不是滥用吗?我不会这么说,因为@DataJpaTest
注释与我使用的@Transactional
完全相同,谢谢你的帮助!
@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
}
}
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