当 application.yml 位于其他位置时,@ Value在JUnit Test期间无效。
FooServiceTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { AppConfig.class })
public class FooServiceTest {
其他模块中的EmailService
public class EmailService {
@Value("${aws.credentials.accessKey}")
private String accessKey;
application.yml
aws:
credentials:
accessKey: XXXXXXXX
secretKey: ZXXXXXXXXX
但我得到了:
Could not resolve placeholder 'aws.credentials.accessKey' in string value "${aws.credentials.accessKey}"
即使我添加了
-Dspring_config_location=/home/foo/other/location/config/
答案 0 :(得分:1)
标准Spring Boot位置
如果要加载spring-boot application.properties
,则应使用Spring Boot启动单元测试(使用@SpringApplicationConfiguration
):
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { AppConfig.class })
public class FooServiceTest {
@Test
public void test...
}
application.yml
应位于类路径中的/config
或root
下。
请参阅Spring Doc:
SpringApplication将从application.properties加载属性 将文件放在以下位置并将它们添加到Spring中 环境:
- 当前目录的A / config子目录。
- 当前目录
- 类路径/配置包
- 类路径根
指定其他位置(例如,从单元测试执行时)
通常情况下,您可以使用PropertySource
,但即使它允许从其他位置加载配置文件,它也不适用于注入(@Value
)属性。
但是,您可以在静态块中指定spring.config.location
环境变量:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { AppConfig.class })
public class FooServiceTest {
static {
//if the file is NOT in the classpath
System.setProperty("spring.config.location", "file:///path/to/application.yml");
//if the file is in the classpath
//System.setProperty("spring.config.location", "classpath:/path/in/classpath/application.yml");
}
@Test
public void test...
}
从Gradle运行测试
根据this,您可以这样做:
$ gradle test -Dspring.config.location=file:///path/to/application.yaml
或者
$ SPRING_CONFIG_LOCATION=file:///path/to/application.yaml gradle test
或添加任务以定义systemProperty:
task extconfig {
run { systemProperty "spring.config.location", "file:///path/to/application.yaml" }
}
test.mustRunAfter extconfig
答案 1 :(得分:0)
如果它外部化属性并希望通过命令行在运行时包含
运行时包含 --spring.config.location = file:///location/application.yml
答案 2 :(得分:0)
使用构造函数注入可以轻松创建不可变服务,并且无需SpringContext即可进行测试:
public class EmailService {
private final String accessKey;`enter code here`
@Autowired
public EmailService(@Value("${aws.credentials.accessKey}") String accessKey) {
this.accessKey = accessKey;
}
}
public class FooTestWithoutSpringContext {
private EmailService emailService;
@Before
public void init() {
emailService = new EmailService("mockPropertyValue");
}
@Test
public void testFoo() {
emailService...
}
}