如何在测试中覆盖spring.config.import?

jhkqcmku  于 2023-06-04  发布在  Spring
关注(0)|答案(1)|浏览(232)

我正在尝试使用git2consul和spring-boot-config-consul方法来外部化配置。解决方案本身工作正常(因此,配置正确)。
要从consul获取配置,我使用application.yml中的spring.config.import

spring:
      config:
         import: "consul:"

这个很好用然而,在一个集成测试中,我想用预定义的一组 prop 替换consul配置,并完全禁用consul。在我尝试之前

@TestPropertySource(properties = {
        "spring.config.import=classpath:/consul/defaults.yml",
        "spring.cloud.consul.enabled=false",
        "spring.profiles.active = test"
})
public class MySpecialCaseITTest{}

然而,这失败是由于

java.lang.IllegalStateException: Unable to load config data from 'consul:'

如果我提供invalud类路径,那么它会失败,抱怨不存在文件(这是正确的),这意味着最有可能的是,我最终得到的是

`spring.config.import="classpath:/consul/defaults.yml,consul:`

或者反过来
如何有效地覆盖application.yml中设置的spring.config.import的值?(使用CLI参数具有相同的效果)

lc8prwob

lc8prwob1#

这里的问题是根据Spring文档
在发现导入时对其进行处理
这意味着从指定配置文件导入的所有内容都将被评估。由于您在默认的application.yal中为consul config定义了import,因此它将始终被评估。
以下是spring-cloud中有关此行为的票证:https://github.com/spring-cloud/spring-cloud-config/issues/1877
而且,目前还没有解决办法。此问题的唯一解决方法:
解决方法1:在默认的application.yml中不使用导入。相反,创建一个新的配置文件application-consul.yaml,并在需要从Consul加载配置的地方使用它。您可以使用多个配置文件(如consul,prod)运行spring应用程序。
解决方法2:为导入路径定义一个单独的属性,并在测试中替换它(在spring Boot 3.1.0上测试):

import-path="consul:"
spring.config.import=${import-path}
@TestPropertySource(properties = {
    "import-path=classpath:/consul/defaults.yml",
    "spring.cloud.consul.enabled=false",
    "spring.profiles.active = test"
})

相关问题