【问题标题】:Spring boot - configuration doesn't load in junit testSpring boot - 配置未在junit测试中加载
【发布时间】:2016-05-13 12:47:44
【问题描述】:

我在 Spring Boot 测试用例中遇到了一个奇怪的问题。我已经尝试了所有我能找到但没有运气的东西。谁能帮帮我。

当我运行 spring boot 应用程序时,一切正常。但测试用例不加载 partnerConfig 属性(它加载其他属性但不加载 partnerConfig)。 如果您有任何提示,请联系我。

Yaml 文件

config:
     MH:
         partner.id: "441"
         tiny.url.domain: "http://mh.local.upgrd.co/"
     EY:
         partner.id: "11"
         tiny.url.domain: "http://ey.local.upgrd.co/"

@Component
@EnableConfigurationProperties
@ConfigurationProperties()
public class PartnerConfig {
    private Map<String, Map<String, String>> config = new HashMap<>();
}

@EnableAutoConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MainMethodRunner.class})
public class PartnerConfigTestIT {
    @Autowired
    PartnerConfig partnerConfig;


    @Test
    public void should_get_carrierCode_from_partnerId() {
        //partnerConfig.config is not available in tests
    }
 } 

当我运行 spring boot 应用程序时,一切正常。但测试用例不加载 partnerConfig 属性(它加载其他属性但不加载 partnerConfig)。 如果您有任何提示,请联系我。

【问题讨论】:

  • MainMethodRunner 长什么样子?
  • @SpringBootApplication public class MainMethodRunner { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(MainMethodRunner.class, args); }}

标签: spring properties spring-boot load


【解决方案1】:

为HashMap添加getter和setter测试通过

【讨论】:

  • 能否详细说明您的回答,以便更好地帮助可能遇到类似问题的未来用户?如果您能给出一些解释并可能显示一些代码,那就太好了!
【解决方案2】:

这最终对我有用:

yaml 文件

dynamodb:
    endpoint: https://localhost:4311
    accesskey: dummy
    secretkey: dummy

tinyurl:
     key.length: 12


partnerConfig:
     DH:
         partner.id: "056"
         tiny.url.domain: "dh.test.upgrd.co"
     HY:
         partner.id: "2001"
         tiny.url.domain: "hy.test.upgrd.co"

我想要一个动态映射 parterConfig 属性的类(无需使用 @Value 硬编码键)因为我想要我们应该能够添加更多 partnerConfigs 并且不需要更改代码的功能。

将属性映射到类的PartnerConfig 类

@Component
@EnableConfigurationProperties
@ConfigurationProperties
public class PartnerConfig {

    private static final String TINY_URL_DOMAIN = "tiny.url.domain";
    private static final String PARTNER_ID = "partner.id";

    private Map<String, Map<String, String>> partnerConfig = new HashMap<>();

    private BiMap<String, String> partnerIdToTinyUrlDomain = HashBiMap.create();

    @PostConstruct
    private void initialize() {
        partnerConfig.forEach((carrierCode, partnerConf) ->
                partnerIdToTinyUrlDomain.put(partnerConf.get(PARTNER_ID), partnerConf.get(TINY_URL_DOMAIN)));
    }

    public String getPartnerId(String tinyUrlDomain) {
        if (isEmpty(tinyUrlDomain))
            throwTinyUrlNotFoundError(tinyUrlDomain);

        String partnerId = partnerIdToTinyUrlDomain.inverse().get(tinyUrlDomain);
        if (isEmpty(partnerId))
            throwTinyUrlNotFoundError(tinyUrlDomain);

        return partnerId;
    }

    public String getTinyUrlDomain(String partnerId) {
        if (isEmpty(partnerId))
            throwPartnerNotFoundError(partnerId);

        String tinyUrlDomain = partnerIdToTinyUrlDomain.get(partnerId);
        if (isEmpty(tinyUrlDomain))
            throwPartnerNotFoundError(partnerId);

        return tinyUrlDomain;
    }

    public void setPartnerConfig(Map<String, Map<String, String>> partnerConfig) {
        this.partnerConfig = partnerConfig;
    }

    public Map<String, Map<String, String>> getPartnerConfig() {
        return partnerConfig;
    }

    private String throwTinyUrlNotFoundError(String tinyUrlDomain) {
        String msg = String.format("tiny url mapping not found for domain %s", tinyUrlDomain);
        throw new TinyUrlNotFoundException(msg);
    }

    private String throwPartnerNotFoundError(String partnerId) {
        String msg = String.format("partner %s is not configured", partnerId);
        throw new PartnerConfigurationException(msg);
    }


}

单元测试看起来像

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MainMethodRunnerTest.class})
@IntegrationTest
public class PartnerConfigTestIT {
    @Autowired
    PartnerConfig partnerConfig;

    @Test
    public void getTinyUrlDomain_should_return_tinyUrlDomain_from_partnerId() {
        assertEquals("hy.test.upgrd.co", partnerConfig.getTinyUrlDomain("2001"));
    }


}

【讨论】:

  • 这是一个集成测试,而不是单元测试;)您将无法在单元测试中加载配置数据。我认为您的原始问题也应该发生在您的生产代码中? AFAIK @ConfigurationProperties 仅适用于可见字段,您必须提供 Getters/Setters 或创建字段 public
猜你喜欢
  • 2019-04-26
  • 2017-02-12
  • 2023-04-10
  • 1970-01-01
  • 2019-01-30
  • 2021-12-23
  • 2022-09-29
  • 2018-01-08
  • 2017-01-25
相关资源
最近更新 更多