我有一些使用@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。
任何帮助都将不胜感激。
答案 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