You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SpringBootTest测试ApplicationConfiguration读取application.yml功能

通用Spring Boot配置类读取yml及对应测试实现方案

前置依赖要求

项目需要引入基础Spring Boot和测试依赖,无需额外特殊包:

<!-- Maven pom.xml 示例 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
// Gradle build.gradle 示例
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

第一步:定义读取yml的ApplicationConfiguration类

1.1 编写yml配置

在src/main/resources/application.yml中添加配置项:

app:
  name: DemoApplication
  max-connection: 10
  enable-cache: true
  allowed-origins:
    - https://a.example.com
    - https://b.example.com
  config:
    timeout: 3000
    retry-count: 3

1.2 配置类实现

支持两种注入方式,任选其一即可:

方式1:@ConfigurationProperties 批量注入(推荐)

Java版本:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "app")
public class ApplicationConfiguration {
    private String name;
    private Integer maxConnection;
    private Boolean enableCache;
    private List<String> allowedOrigins;
    private Config config;

    public static class Config {
        private Integer timeout;
        private Integer retryCount;

        // 嵌套类getter、setter
        public Integer getTimeout() { return timeout; }
        public void setTimeout(Integer timeout) { this.timeout = timeout; }
        public Integer getRetryCount() { return retryCount; }
        public void setRetryCount(Integer retryCount) { this.retryCount = retryCount; }
    }

    // 所有属性的getter、setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Integer getMaxConnection() { return maxConnection; }
    public void setMaxConnection(Integer maxConnection) { this.maxConnection = maxConnection; }
    public Boolean getEnableCache() { return enableCache; }
    public void setEnableCache(Boolean enableCache) { this.enableCache = enableCache; }
    public List<String> getAllowedOrigins() { return allowedOrigins; }
    public void setAllowedOrigins(List<String> allowedOrigins) { this.allowedOrigins = allowedOrigins; }
    public Config getConfig() { return config; }
    public void setConfig(Config config) { this.config = config; }
}

Groovy版本(无需手写getter、setter):

import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Configuration

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "app")
class ApplicationConfiguration {
    String name
    Integer maxConnection
    Boolean enableCache
    List<String> allowedOrigins
    Config config

    static class Config {
        Integer timeout
        Integer retryCount
    }
}

方式2:@Value 单个注入

如果现有配置类是用@Value实现的,也可以直接用后续的测试逻辑,不需要修改配置类:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfiguration {
    @Value("${app.name}")
    private String name;
    @Value("${app.max-connection}")
    private Integer maxConnection;
    // 其余属性同理

    // getter、setter
}

第二步:编写测试用例

测试类放在src/test/java对应包路径下,核心逻辑为启动Spring上下文注入配置类,断言属性和yml配置一致即可。
Java版本:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class ApplicationConfigurationTests {
    @Autowired
    private ApplicationConfiguration applicationConfiguration;

    @Test
    void testYmlConfigLoadSuccess() {
        // 断言顶层属性
        assertEquals("DemoApplication", applicationConfiguration.getName());
        assertEquals(10, applicationConfiguration.getMaxConnection());
        assertTrue(applicationConfiguration.getEnableCache());
        assertEquals(2, applicationConfiguration.getAllowedOrigins().size());
        assertTrue(applicationConfiguration.getAllowedOrigins().contains("https://a.example.com"));

        // 断言嵌套属性
        assertNotNull(applicationConfiguration.getConfig());
        assertEquals(3000, applicationConfiguration.getConfig().getTimeout());
        assertEquals(3, applicationConfiguration.getConfig().getRetryCount());
    }
}

Groovy版本:

import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import static org.junit.jupiter.api.Assertions.*

@SpringBootTest
class ApplicationConfigurationTests {
    @Autowired
    ApplicationConfiguration applicationConfiguration

    @Test
    void testYmlConfigLoadSuccess() {
        assertEquals "DemoApplication", applicationConfiguration.name
        assertEquals 10, applicationConfiguration.maxConnection
        assertTrue applicationConfiguration.enableCache
        assertEquals 2, applicationConfiguration.allowedOrigins.size()
        assertTrue applicationConfiguration.allowedOrigins.contains("https://a.example.com")

        assertNotNull applicationConfiguration.config
        assertEquals 3000, applicationConfiguration.config.timeout
        assertEquals 3, applicationConfiguration.config.retryCount
    }
}

可选优化:使用测试专用配置

如果希望测试不依赖生产环境的配置,可以在src/test/resources下新建application-test.yml,在测试类上添加@ActiveProfiles("test")注解,即可加载测试专用配置。

最小实现核心规则

  • 配置类必须加@Configuration注解被Spring上下文识别
  • 测试类必须加@SpringBootTest触发Spring Boot自动装配,否则无法注入配置类
  • 配置类所有属性必须有public的getter和setter,Groovy默认生成无需手写
  • 短横线命名的yml配置会自动映射到驼峰命名的Java属性,不需要额外配置

内容的提问来源于stack exchange,提问作者BustedChain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:48:03