如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?

Posted

技术标签:

【中文标题】如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?【英文标题】:How do I import configuration classes in a @DataJpaTest in a SpringBootTest? 【发布时间】: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 也是一个元注释,为我的数据库提供了合理的自动配置,包括事务管理。但是如果我不需要它怎么办?

【问题讨论】:

【参考方案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 放在您的应用程序类中或将它们滚动到一个大型配置中。

以上是关于如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在@SpringBootTest 之前添加设置并且只运行一次?

使用@SpringBootTest时如何在测试类中自动装配bean

Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法

春季启动测试:弹簧属性被忽略

如何模拟@springboottest 的应用程序配置或上下文?

如何使用@SpringBootTest 验证作业是不是运行了另一个作业