我有一个春季启动项目,效果很好。我现在想为我的应用程序编写测试,但我遇到了一些配置难题。
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文件从?
加载属性答案 0 :(得分:9)
我们可以使用@TestPropertySource
或@PropertySource
加载属性文件
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:properties.yml")
@ActiveProfiles("test")
public class DuurzaamApplicationTests {
@Test
public void contextLoads() {
}
}
答案 1 :(得分:4)
令我惊讶的是,当您在Spring Boot Test中加载属性文件时,不支持.yml
。在文档中已对此进行了说明,尽管是隐式的。
从上面的链接:
未提及支持的文件格式
同时支持传统和基于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")