Spring启动测试 - 无法找到测试属性

时间:2017-08-13 10:20:35

标签: spring unit-testing spring-boot

我有一个春季启动项目,效果很好。我现在想为我的应用程序编写测试,但我遇到了一些配置难题。

Spring boot为我创建了一个名为ApplicationTests的测试类。这很简单,看起来像这样:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DuurzaamApplicationTests {
    @Test
    public void contextLoads() {
    }    
}

现在,当我开始测试时,我收到了这个错误:

java.lang.IllegalArgumentException: Could not resolve placeholder 'company.upload' in value "${company.upload}"

我在src / test / resources目录中有一个properties.yml文件,由于某种原因它没有被加载。我从互联网上的例子中尝试了所有不同类型的注释,但它们都没有工作。

如何告诉spring boot测试使用application.yml文件从?

加载属性

6 个答案:

答案 0 :(得分:9)

我们可以使用@TestPropertySource@PropertySource加载属性文件

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:properties.yml")
@ActiveProfiles("test")
public class DuurzaamApplicationTests {
    @Test
    public void contextLoads() {
    }    
}

文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

答案 1 :(得分:4)

令我惊讶的是,当您在Spring Boot Test中加载属性文件时,不支持.yml。在文档中已对此进行了说明,尽管是隐式的。

从上面的链接:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

  

支持的文件格式

     

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

未提及

.yml

然后,将我的.yml更改为.properties并以xx.xx.xx=value格式重写值之后,可以正确读取键值对。

太奇怪了。

编辑:

现在我找到了解决此问题的票证;似乎是Spring中一个众所周知的错误。

https://github.com/spring-projects/spring-framework/issues/18486

答案 2 :(得分:1)

@TestPropertySource*.yml不适用于YAML。参见this

我也亲自测试过它。尝试创建2个文件-* .yml和* .properties,然后亲自查看。

要使@SpringBootTest正常工作,大多数人会使用@ContextConfiguration,但是如果这不是您想要的,而您想使用__array_finalize__(self, obj),那么您会感到有些惊讶。 / p>

答案 3 :(得分:0)

对我来说,以上解决方案无效,并且即使https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html指示此源应比环境变量具有更高的优先级,任何环境变量仍将覆盖@TestPropertySource中定义的测试属性。对我有用的唯一解决方案是在测试配置类中手动定义一个PropertyPlaceholderConfigurer bean,并将其设置为最高优先级。

这是在Spring Boot 1.5.15中发布的。

@Configuration
@TestPropertySource(properties = "/application-test.properties")
@Slf4j
public class IntegrationTestConfiguration {

@Bean
public static PropertyPlaceholderConfigurer properties() {
    PropertyPlaceholderConfigurer ppc
          = new PropertyPlaceholderConfigurer();
    Resource[] resources = new ClassPathResource[]
          { new ClassPathResource( "/application-test.properties" ) };
    ppc.setLocations( resources );
    ppc.setIgnoreUnresolvablePlaceholders( true );
    ppc.setOrder( Ordered.HIGHEST_PRECEDENCE );

    return ppc;
}

/// ....

@RunWith( SpringRunner.class )
@ActiveProfiles( "test" )
@Import( IntegrationTestConfiguration.class )
@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
public class MyTest {

答案 4 :(得分:0)

我有同样的错误消息,我的问题是application.properties中的src\test\resources缺少新属性

答案 5 :(得分:0)

有时无法找到您的 application-test.properties 文件,因为它位于类路径之外的子文件夹中。

例如这个可能找不到,因为文件实际上并不直接在类路径中。

@TestPropertySource("classpath:application-test.properties")

但是如果文件位于类路径中的路径之外的 config 文件夹中,则会找到此

@TestPropertySource("classpath:config/application-test.properties")