在测试用例中定义弹簧活动配置文件

Jon*_*gat 4 java spring spring-test

使用Spring 4,我有以下测试设置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JpaConfig.class)
@ActiveProfiles(resolver = TestResolver.class)
public class SimpleTest {
Run Code Online (Sandbox Code Playgroud)

TestResolver已实现为:

public class TestResolver implements ActiveProfilesResolver {
    @Override
    public String[] resolve(Class<?> aClass) {
        String[] profiles = new String[1];
        profiles[0] = "test";
        return profiles;
    }
}
Run Code Online (Sandbox Code Playgroud)

JpaConfig已经使用PropertySource注释

@Configuration
@PropertySource("classpath:properties/application-${spring.profiles.active:dev}.properties")
@EnableJpaRepositories(basePackages={"com.my.namespace.repositories"})
public class JpaConfig {
Run Code Online (Sandbox Code Playgroud)

每当我运行SimpleTest时,它会尝试找到:properties/application-dev.properties,而我期望它是properties/application-test.properties.

我在这里要完成的是基于以下帖子:使用profile进行Spring集成测试

And*_*fan 11

我相信实际上是你所面临的问题.在一篇文章中,您有来自Dave Syer的解释以及来自其他用户的可能解决方案.为了遵循Dave的建议,这将是一个可能的实现ApplicationContextInitializer:

public class MyApplicationContextInitializer implements
    ApplicationContextInitializer<GenericApplicationContext> {

public void initialize(GenericApplicationContext context) {
    context.getEnvironment().getSystemProperties().put(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "some_profile");
}
Run Code Online (Sandbox Code Playgroud)

}

并在您的测试类:

@ContextConfiguration(classes = JpaConfig.class, initializers = MyApplicationContextInitializer.class)
Run Code Online (Sandbox Code Playgroud)

但我会说在SO帖子中建议的方法(为不同的配置文件加载了不同的.properties文件)是一种更优雅的方法.