如何编写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
相关产品推荐
相关产品推荐

