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

时间:2014-04-22 08:03:17

标签: java spring spring-test

使用Spring 4,我得到了以下测试设置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JpaConfig.class)
@ActiveProfiles(resolver = TestResolver.class)
public class SimpleTest {

TestResolver已实现为:

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

JpaConfig已使用PropertySource注释

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

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

我在此尝试完成的内容基于以下帖子:Spring integration tests with profile

2 个答案:

答案 0 :(得分:11)

我相信this实际上是您面临的问题。在那个same post中,你有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");
}

}

并在您的测试班上:

@ContextConfiguration(classes = JpaConfig.class, initializers = MyApplicationContextInitializer.class)

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

答案 1 :(得分:1)

我认为您应该将@PropertySource更改为:

@PropertySource("classpath:properties/application-${spring.profiles.active}.properties")

同样为了简单起见(不应对代码运行方式产生任何影响),@ ActiveProfile可能

@ActiveProfiles("test")