spring 以编程方式更改Sping Boot 属性

x33g5p2x  于 2023-05-05  发布在  Spring
关注(0)|答案(2)|浏览(139)

我正在尝试为使用@RefreshScope的应用程序编写测试。我想添加一个测试,它实际上改变了属性,并Assert应用程序正确响应。我已经知道如何触发刷新(在RefreshScope中自动装配并调用refresh(...)),但还没有找到修改属性的方法。如果可能的话,我想直接写入属性源(而不是必须处理文件),但我不确定在哪里查找。

更新

下面是我正在寻找的一个例子:

public class SomeClassWithAProperty {
    @Value{"my.property"}
    private String myProperty;

    public String getMyProperty() { ... }
}

public class SomeOtherBean {
    public SomeOtherBean(SomeClassWithAProperty classWithProp) { ... }

    public String getGreeting() {
        return "Hello " + classWithProp.getMyProperty() + "!";
    }
}

@Configuration
public class ConfigClass {
    @Bean
    @RefreshScope
    SomeClassWithAProperty someClassWithAProperty() { ...}

    @Bean
    SomeOtherBean someOtherBean() {
        return new SomeOtherBean(someClassWithAProperty());
    }
}

public class MyAppIT {
    private static final DEFAULT_MY_PROP_VALUE = "World";

    @Autowired
    public SomeOtherBean otherBean;

    @Autowired
    public RefreshScope refreshScope;

    @Test
    public void testRefresh() {
        assertEquals("Hello World!", otherBean.getGreeting());

        [DO SOMETHING HERE TO CHANGE my.property TO "Mars"]
        refreshScope.refreshAll();

        assertEquals("Hello Mars!", otherBean.getGreeting());
    }
}
wkftcu5l

wkftcu5l1#

您可以这样做(我假设您错误地忽略了示例顶部的JUnit注解,因此我将为您添加它们):

@SpringBootTest
public class MyAppIT {

    @Autowired
    public ConfigurableEnvironment environment;

    @Autowired
    public SomeOtherBean otherBean;

    @Autowired
    public RefreshScope refreshScope;

    @Test
    public void testRefresh() {
        assertEquals("Hello World!", otherBean.getGreeting());

        EnvironmentTestUtils.addEnvironment(environment, "my.property=Mars");
        refreshScope.refreshAll();

        assertEquals("Hello Mars!", otherBean.getGreeting());
    }
}

在主类上还需要一个@SpringBootApplication注解。
但是您并没有真正测试您的代码,只是SpringCloud的刷新范围特性(已经针对这种行为进行了广泛的测试)。
我非常肯定您也可以从现有的刷新范围测试中得到这一点。

jw5wzhpr

jw5wzhpr2#

应用程序中使用的属性必须是用@Value注解的变量。这些变量必须属于由Spring管理的类,比如带有@Component注解的类。
如果要更改属性文件的值,可以设置不同的配置文件,并为每个配置文件设置各种.properties文件。
我们应该注意到这些文件是静态的,只加载一次,所以以编程方式更改它们有点超出了预期的使用范围。但是,您可以在spring Boot 应用程序中设置一个简单的REST端点,该端点修改主机文件系统上的文件(很可能在您正在部署的jar文件中),然后在原始spring boot应用程序上调用Refresh。

相关问题