微型轮廓|配置-使用动态值进行测试

时间:2019-02-07 20:57:53

标签: java jboss-arquillian tomee microprofile tomee-8

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

2 个答案:

答案 0 :(得分:1)

您可以注册一个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");

答案 1 :(得分:0)

关于Microprofile Config: Spec: Configsource,其中提到了以下内容:-

  

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

     

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

     

每个属性文件的ConfigSource   在类路径上找到META-INF / microprofile-config.properties。   (默认序数= 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());
    }

}
system properites

EDIT1

此外,如果我们想控制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"); ... } ,则System Rules将使我们的生活更加轻松。他们提供ClearSystemPropertiesProvideSystemPropertyRestoreSystemProperties作为其文档中的以下示例。

        $("#myCodeA").keyup(function () {

            if ($(this).val().length > 0) {

                $("#myCodeB").prop("disabled", true);


            } else {

                $("#myCodeB").prop("disabled", false);
            }

        });


        $("#myCodeB").keyup(function () {

            if ($(this).val().length > 0) {

                $("#myCodeA").prop("disabled", true);

            } else {

                $("#myCodeA").prop("disabled", false);
            }

        });

}