如何在 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=10caching.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 加载测试配置文件并使用@ActiveProfiletest 作为该测试类的活动配置文件

【讨论】:

以上是关于如何在 Spring Boot 中将属性注入测试类?的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 将配置文件属性注入到一个bean中

使用注入 java 和 spring boot 的 RestTemplate 类进行单元测试

多部分表单数据输入 Java 模型属性未在请求类中注入元素 - Spring Boot

springboot 复制属性BeanUtils.copyProperties

Spring boot 工具类静态属性注入及多环境配置

如何在 Wildfly 中将外部属性文件加载到 Spring Boot