【问题标题】:How do I import configuration classes in a @DataJpaTest in a SpringBootTest?如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?
【发布时间】:2017-09-28 01:53:00
【问题描述】:

我有一个 SpringBoot 应用程序和一个配置包

@Configuration
@EnableJpaAuditing
public class PersistenceConfig {
}

但是 PersistenceConfig 没有在 PersonRepositoryTest

中被提取
@RunWith( SpringRunner.class )
@DataJpaTest
public class PersonRepositoryTest {

    // Tests ...
}

但是,如果我从 @DataJpaTest to @SpringBootTest 更改,PersonRepositoryTest 将获取配置。

我的包结构

- main
    - java
        - config
              PersistenceConfig.java
        - domain
              Person.java
        - persistence
              PersonRepository.java
          Application.java // @SpringBootApplication

- test
    - java
        - persistence
              PersonRepositoryTest.java

Testing improvements in Spring Boot 1.4 建议使用@DataJpaTest 测试持久层

观察: 在测试类上做两个注释仍然不导入配置 @SpringBootTest @DataJpaTest

问题 1: 使用 @DataJpaTest 测试持久层时 如何正确(Spring Boot 中的最佳实践方式)将配置包导入我的测试?

问题 2: 使用@SpringBootTest 是否可以接受?我知道@DataJpaTest 也是一个元注释,为我的数据库提供了合理的自动配置,包括事务管理。但是如果我不需要它怎么办?

【问题讨论】:

    标签: spring unit-testing spring-boot configuration spring-data-jpa


    【解决方案1】:

    一种解决方案是使用@Import 将您的配置导入到@DataJpaTest 完成的配置中。这是我对@Import的理解。

    @RunWith(SpringRunner.class)
    @DataJpaTest
    @Import(AuditConfiguration.class)
    public class AuditTest {
    }
    

    AuditConfiguration 启用审计

    @Configuration
    @EnableJpaAuditing
    public class AuditConfiguration {
    }
    

    【讨论】:

    • 这个解决方案是优越的,因为它是细粒度的,并且不会与切片表达的相反。
    【解决方案2】:

    你可以试试这个: 使用 @ComponentScan 注释 PersistenceConfig 以在 Spring 中启用组件扫描。

    @Configuration
    @EnableJpaAuditing
    @ComponentScan(basePackages = "com.yourbasepackage")
    public class PersistenceConfig {
    }
    

    无需进一步配置,@ComponentScan 将默认扫描与PersistenceConfig 类相同的包。

    并添加 @Context-Configuration 注释,告诉它从 PersistenceConfig.class 加载其配置。

    @RunWith( SpringRunner.class )
    @DataJpaTest
    @ContextConfiguration(classes=PersistenceConfig.class)
    public class PersonRepositoryTest {
    
        // Tests ...
    }
    

    【讨论】:

    • 干杯!有用。所以当我在 config 包中有更多的配置类时,它们都会自动被拾取,因为我在这个包中添加了@ComponentScan 到 一个
    • 另外,为什么开箱即用 SpringBootTest 注释?任何地方都不需要 ComponentScan 注释。
    • 我不知道,但我建议您阅读 Spring in action 第 4 版第 2.2 章自动连接 bean。您还可以阅读 Spring Boot in Action 的第 4 章。
    • 好的,我去拿这本书。谢谢乔治!
    【解决方案3】:

    在@georges van post 之后,我发现所有配置类 也可以通过在测试中添加一行来获取:

    @RunWith( SpringRunner.class )
    @DataJpaTest
    @ComponentScan(basePackages = "com.basepackage.config")
    public class PersonRepositoryTest {
    
        // Tests ...
    }
    

    如果有人只想要一个特定的配置类,你可以这样做:

    @RunWith( SpringRunner.class )
    @DataJpaTest
    @ContextConfiguration(classes=MyConfig.class)
    public class PersonRepositoryTest {
    
        // Tests ...
    }
    

    或多个类:

    @ContextConfiguration(classes={MyConfig1.class, MyConfig2.class})

    【讨论】:

    • 您可能需要小心,因为DataJpaTest 是一个切片,如果它在配置中启用@Enablething,则扫描所有配置可能会引入意外的必需依赖项。这就是为什么您应该避免将@Enable 放在您的应用程序类中或将它们滚动到一个大型配置中。
    猜你喜欢
    • 2022-01-14
    • 2019-12-27
    • 1970-01-01
    • 2018-05-07
    • 2019-02-14
    • 2019-09-14
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多