Spring Boot:未在Test类中设置属性值

时间:2018-12-19 12:57:58

标签: java spring spring-boot junit

下面是我的项目结构

SomeProject
    -src/main/java
    -src/main/resources
    -src/test/java
    -src/test/resources
        application-test.yml

下面是我的属性文件的内容

application-test.yml

pre:
    someUrl: http://someurl

下面是配置类的内容

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "pre")
public class SomeConfiguration {

    private String someUrl;

    public String getsomeUrl() {
        return someUrl;
    }

    public void setsomeUrl(String someUrl) {
        this.someUrl = someUrl;
    }
}

下面是我的测试班

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=SomeConfiguration.class)
@TestPropertySource(locations = {"classpath:application-test.yml"})
public class SomeServiceTest {

    SomeObject someObject;

    @Autowired
    private SomeConfiguration someConfiguration; 

    @Test
    public void somMethodTest() {
        someObject = new SomeObject ();
        someObject.setsomeUrl(someConfiguration.getsomeUrl());

    }
}

问题是,当我尝试在 someObject 中设置 someURL 时,我得到的是空值。我已经在stackoverflow上看到了类似的问题,并且也接受了答案,但是我仍然没有得到答案。

2 个答案:

答案 0 :(得分:0)

根据@ConfigurationProperties文档:

  

字母和setter通常是强制性的,因为绑定是通过   标准的Java Beans属性描述符。

private String sameUrl的设置器是 setSameUrl ,而不是 setsameUrl

所以spring可以从属性文件中读取它,但是它不能通过setter注入。

答案 1 :(得分:0)

不幸的是,@ TestPropertySource或@PropertySource不支持yml文件。

关于这个事实,我认为@TestPropertySource的文档并不明确,但是以下JIRA已关闭。评论之一说...

  

@TestPropertySource中的locations属性已经提供了以下文档:

     

支持的文件格式

     

同时支持传统和基于XML的属性文件格式,例如“ classpath:/com/example/test.properties”或“ file:/path/to/file.xml”。

spring docs中的以下内容针对@PropertySource进行了说明:

  

24.7.4 YAML缺点

     

无法使用@PropertySource批注来加载YAML文件。   因此,如果您需要以这种方式加载值,则需要使用   属性文件。

如果您create a suitable factory,则可以获取@PropertySource来加载yaml,不确定是否可以使用@TestPropertySource进行加载。