1

我在我的应用程序中使用 Microprofile Config ( @Inject, not ConfigProvider)。我有一个配置,它为不同的值采用不同的分支。为了测试 ( Arquillian) 我代码中的所有路径,我需要能够在运行时更改此值。有人可以提供有关如何实现这一目标的提示吗?我的属性是使用系统属性设置的,但我对如何处理这个问题持开放态度。

4

2 回答 2

2

您可以注册一个ConfigSource可以轻松配置的。您可以查看我为 mp-config TCK 本身编写的一个: https ://github.com/eclipse/microprofile-config/blob/master/tck/src/main/java/org/eclipse/microprofile/config /tck/configsources/ConfigurableConfigSource.java

要将此 ConfigSource 添加到您的 Arquillian @Deployment,请检查以下测试: https ://github.com/eclipse/microprofile-config/blob/1499b7bf734eb1710fe3b7fbdbbcb1ca0983e4cd/tck/src/main/java/org/eclipse/microprofile/config/tck/ConfigAccessorTest .java#L52

重要的几行是:

.addClass(ConfigurableConfigSource.class)
.addAsServiceProvider(ConfigSource.class, ConfigurableConfigSource.class)

然后调整值

ConfigurableConfigSource.configure(config, "my.config.entry", "some new value");
于 2019-03-11T22:12:13.357 回答
0

关于Microprofile Config:Spec: Configsource,其中提到如下:-

系统属性(默认序数=400)。

环境变量(默认序数=300)。

在类路径中找到的每个属性文件 META-INF/microprofile-config.properties 的 ConfigSource。(默认序数 = 100)。

这意味着system properties这里是最高优先级。然后我们可以设置默认值并在META-INF/microprofile-config.properties需要时覆盖它system properties

在集成测试期间,我们可以将system properties与使用 一起设置javax.inject.Provider以使其动态检索,以便覆盖默认值,如下例所示:-

# META-INF/microprofile-config.properties
my.key=original
import javax.inject.Inject;
import javax.inject.Provider;

import org.eclipse.microprofile.config.inject.ConfigProperty;

public class SomeClass {
    @Inject
    @ConfigProperty(
        name = "my.key"
    )
    private Provider<String> key1;

    public String doSomethingWithConfig() {
        return key1.get();
    }
}
import javax.inject.Inject;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.junit.InSequence;
import org.junit.Test;
import org.junit.Assert;

@RunWith(Arquillian.class)
public class SomeClassTester {

    @Inject
    private SomeClass someclass;

    @Test
    @InSequence(1)
    public void whenTestDefaultConfig() {
        Assert.assertEquals("The value must be a defualt.",
                            "original", 
                            this.someclass.doSomethingWithConfig());
    }

    @Test
    @InSequence(2)
    public void whenTestOverrideMPConfig() {

        System.setProperty("my.key",
                           "new-value");
        Assert.assertEquals("The value must be overridden",
                            "new-value", 
                            this.someclass.doSomethingWithConfig());
    }

}

编辑1

此外,如果我们想控制system properites系统规则将使我们的生活更轻松。他们提供ClearSystemPropertiesProvideSystemPropertyRestoreSystemProperties作为他们文档中的以下示例。

public class MyTest {
    @Rule
    public final RestoreSystemProperties restoreSystemProperties
     = new RestoreSystemProperties();

    @Test
    public void overrideProperty() {
        //after the test the original value of "MyProperty" will be restored.
        System.setProperty("MyProperty", "other value");
        ...
    }

}

于 2019-02-08T04:05:12.533 回答