在Java中定义spring属性值

时间:2014-05-23 02:43:08

标签: spring spring-annotations spring-test

我有一些使用@Value注释连接属性值的spring bean。

e.g。

@Value("${my.property}")
private String myField;

通常,这些值来自属性文件。

我目前正在编写的测试使用基于完全注释的配置。

e.g。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
public class AcceptanceTest implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Configuration
    @ComponentScan(basePackages = {
        "my.package.one",
        "my.package.two"
    })
    static class ContextConfiguration {
        @Bean
        public MyBean getMyBean(){
            return new MyBean();
        }
    }

    @Autowired
    private AnotherBean anotherBean;

    @Test
    public void testTest(){
        assertNotNull(anotherBean);
        . . .
    }   
    . . .

我不想引用外部属性文件,因为我想保留测试的所有内容。

无论如何,我可以在java中指定这些属性的值,以便它们自动连接到任何需要它们的bean。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

这是一个简单的方法:

@Configuration
public class PropertiesConfig {

    @Bean
    public PropertyPlaceholderConfigurer myConfigurer() {
        PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
        Properties props = new Properties();
        Map myMap = new HashMap<String, String>();

        myMap.put("my.property", "my value");
        myMap.put("second.my.property", "another value");
        props.putAll(myMap);

        configurer.setProperties(props);
        return configurer;
    }
}

答案 1 :(得分:2)

从Spring Framework 4.1开始,您可以使用@TestPropertySource注释声明为您的测试加载的ApplicationContext内联属性,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestPropertySource(properties = { "foo = bar", "magicNumber: 42" })
public class ExampleTests { /* ... */ }

有关详细信息,请参阅参考手册的Context configuration with test property sources部分。


在Spring Framework 4.1之前,最简单的方法是配置自定义PropertySource并使用Spring TestContext Framework注册它(在为您的测试加载ApplicationContext之前)。

您可以通过实施自定义ApplicationContextInitializer并使用org.springframework.mock.env.MockPropertySource来完成此操作:

public class PropertySourceInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    public void initialize(ConfigurableApplicationContext applicationContext) {
         applicationContext.getEnvironment().getPropertySources().addFirst(
           new MockPropertySource().withProperty("foo", "bar"));
    }
}

然后您可以为您的测试注册初始化程序,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = PropertySourceInitializer.class)
public class ExampleTests { /* ... */ }

此致

Sam( Spring TestContext Framework的作者

答案 2 :(得分:0)

如果你使用的是Spock,你也可以使用@TestPropertySource:

@SpringBootTest
@TestPropertySource(properties = [ "my.test.property = bar", "..." ])

当然,它需要String数组采用Groovy语法,这让我感到困惑。我使用的是Spock 1.1