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

Posted

技术标签:

【中文标题】如何为具有属性依赖项的 Spring Boot Application 类编写测试用例 - 无法解析占位符【英文标题】:How to write test case for Spring boot Application class with properties dependency - Could not resolve placeholder 【发布时间】:2019-11-04 17:10:07 【问题描述】:

我按照下面的 *** 页面为 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】:

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。在普通的app中,YamlPropertySourceLoader被注册并可以处理。

可能的解决方案:

要么将您的配置更改为 .properties,要么依靠配置文件来加载您的测试配置。

【讨论】:

我用“application.properties”文件替换了“test-manifest.yml”。它按预期工作,但我的其他测试用例正在使用“.yml”TestPropertySource。为什么它可以使用 MockMvc 处理我的传统测试用例? 如果您使用 application.properties(甚至 application.yml),则不需要 TestPropertySource。如果没有看到其他测试,很难猜测它们会发生什么。

以上是关于如何为具有属性依赖项的 Spring Boot Application 类编写测试用例 - 无法解析占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring boot 插件 2.0.x 从一个具有不同依赖项的 gradle 项目生成 2 个 jars

如何为具有 Spring Security 配置的 Spring Boot API 编写单元测试

如何使用spring boot plugin 2.0.x从一个具有不同依赖项的gradle项目生成2个jar

如何为 Spring Boot 启动器拆分库中的代码

spring Boot必用依赖框架

使用 Spring Boot 服务作为批处理作业中的依赖项的空指针异常