【问题标题】:How to get properties injected into test class in Spring Boot?如何在 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

标签: java spring-boot


【解决方案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 作为该测试类的活动配置文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 2021-11-24
      • 2015-03-04
      • 2023-03-31
      • 2015-12-26
      • 2019-03-18
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多