如何在 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 静态方法