SpringBoot - @Value在JUnit Test期间无法自定义弹簧配置位置

时间:2016-09-07 11:25:59

标签: spring gradle spring-boot

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/

3 个答案:

答案 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应位于类路径中的/configroot下。

请参阅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

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-change-the-location-of-external-properties

答案 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...
    }
}