如何为具有属性依赖性的Spring Boot Application类编写测试用例-无法解析占位符

时间:2019-06-21 20:58:51

标签: spring-boot junit

我遵循下面的StackOverflow页面,并为Application类编写了测试用例 How to test main class of Spring-boot application

运行测试用例时,出现以下错误

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'http.client.connection.timeout' in value "${http.client.connection.timeout}"
.....

我在测试用例中添加了@TestPropertySource(“ classpath:test-manifest.yml”)。

test-manifest.yml 具有“ http.client.connection.timeout

我的测试用例

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.mypackage.Application;

@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource("classpath:test-manifest.yml")
@SpringBootTest
public class MainTest {

    @Test
    public void main() {
        Application.main(new String[] {});
    }
}

如何使其起作用?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

TestPropertySource不支持Yaml配置文件。

选中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”。

另请参阅 TestPropertySourceUtils.addPropertiesFilesToEnvironment()

try {
    for (String location : locations) {
        String resolvedLocation = environment.resolveRequiredPlaceholders(location);
        Resource resource = resourceLoader.getResource(resolvedLocation);
        environment.getPropertySources().addFirst(new ResourcePropertySource(resource));
    }
}

ResourcePropertySource只能处理.properties文件,而不能处理.yml。在常规应用中,YamlPropertySourceLoader已注册并且可以处理。

可能的解决方案:

将配置更改为.properties或依靠配置文件加载测试配置。