如何在 Spring Boot 中将属性注入测试类?
Posted
技术标签:
【中文标题】如何在 Spring Boot 中将属性注入测试类?【英文标题】:How to get properties injected into test class in Spring Boot? 【发布时间】:2020-02-07 02:32:41 【问题描述】:如何将 application-test.properties 中的属性加载到 Spring Boot 中的测试类中?我做错了什么但无法弄清楚?
我可以从 application.properties 中获取下面给出的配置类的属性
package org.vinodh.testing;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import lombok.Data;
@Configuration
@ConfigurationProperties(prefix = "caching")
@Data
public class CachingConfig
@Value("$caching.name")
private String name;
@Data
public static class CacheSpec
private int minutesToExpire;
private int maximumSize;
private Map<String, CacheSpec> specs;
@Bean
public void test()
System.out.println(name);
System.out.println(specs);
但是当我尝试在测试类中做同样的事情时,我会得到空值,请参见下面的代码。如何让我的测试类打印属性文件中的值?
package org.vinodh.testing;
import java.util.Map;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import lombok.Data;
@RunWith(SpringRunner.class)
@ContextConfiguration
@ConfigurationProperties(prefix = "caching")
@TestPropertySource("/application-test.properties")
@Data
public class CachingConfigTest
@Value("$caching.name")
private String name;
@Data
public static class CacheSpec
private int minutesToExpire;
private int maximumSize;
private Map<String, CacheSpec> specs;
@Test
public void test()
System.out.println(name);
System.out.println(specs);
application.properties
caching.specs.test.minutesToExpire=10
caching.specs.test.maximumSize=10
caching.name=Vinodh
application-test.properties
caching.specs.test.minutesToExpire=10
caching.specs.test.maximumSize=10
caching.name=Vinodh
【问题讨论】:
添加@ActiveProfile("test")
。
属性的拼写应该像caching.specs.test.minutes-to-expire=10
和caching.specs.test.maximum-size=5
【参考方案1】:
试试这个 spring.config.additional-location=classpath:/application-test.properties
【讨论】:
【参考方案2】:其实你不需要在测试类中创建CacheSpec
也不推荐,你可以使用源码包中的原始的。但只需将getter
添加到CachingConfig
中的私人地图specs
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
@Profile("test")
public class CachingConfigTest
@Autowired
private CachingConfig cachingConfig;
@Test
public void test()
System.out.println(cachingConfig.getSpecs());
而且你也不需要@TestPropertySource
,你可以使用@Profile
加载测试配置文件并使用@ActiveProfile
将test
作为该测试类的活动配置文件
【讨论】:
以上是关于如何在 Spring Boot 中将属性注入测试类?的主要内容,如果未能解决你的问题,请参考以下文章
使用注入 java 和 spring boot 的 RestTemplate 类进行单元测试
多部分表单数据输入 Java 模型属性未在请求类中注入元素 - Spring Boot