在集成测试中使用 Spring @ActiveProfile

Posted

技术标签:

【中文标题】在集成测试中使用 Spring @ActiveProfile【英文标题】:Using Spring @ActiveProfile in integration tests 【发布时间】:2013-08-29 12:35:11 【问题描述】:

我正在使用@Profile Spring 注释在嵌入式、独立和容器管理的数据源之间进行选择。为了选择“嵌入式”,我的集成测试被注释以激活适当的配置文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes=TestConfigWrapper.class)
@ActiveProfiles("EMBEDDED_DB")
public class SomeIntegrationTest 

问题是我想将 '@ActiveProfiles' 移动到 TestConfigWrapper 中,但是这样做不会被拾取并且应用程序上下文不会加载任何数据源。

这意味着我必须使用 @ActiveProfile 注释每个集成测试,这实际上意味着它成为集成测试样板并且很容易阻碍未来的重构。

有没有办法使用 java config 做到这一点?

【问题讨论】:

@ContextConfiguration 和 @ActiveProfiles 如果我没记错的话可以被继承,因此虽然不灵活,但你可以将它们放在一个抽象类上并让每个集成测试扩展它。 完美——这就是我最终使用的:@WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=WebAppInitializer.class) @ActiveProfiles(Profiles.EMBEDDED_DB) 公共抽象类 ProfiledIntegrationTest 【参考方案1】:

Hippooom 的每条评论使用抽象类来配置测试:

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=WebAppInitializer.class)
@ActiveProfiles(Profiles.EMBEDDED_DB)
public abstract class ProfiledIntegrationTest 


【讨论】:

另一种选择是将其作为注释。然后你只需要在你的测试类上使用那个注释。两者应该有同等的影响。

以上是关于在集成测试中使用 Spring @ActiveProfile的主要内容,如果未能解决你的问题,请参考以下文章

在 SpringBoot 中使用 Testcontainers 进行 Spring Data Elasticsearch 集成测试

使用内存数据库在 Spring Boot 中进行集成测试

Spring集成测试不回滚

Spring启动在集成测试中使用PowerMock模拟静态方法

@WithMockUser 在集成测试中不起作用 - Spring boot

带有配置文件的 Spring 集成测试