Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替代@DirtyContext,用于spring引导下的独立JUnit测试,内存数据库中有H2_Java_Spring Boot_Junit_Spring Test - Fatal编程技术网

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

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数据库自动启动每

现在我在JUnit测试类中使用了
@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