Микропрофиль |Config - Тестирование с динамическими значениями - PullRequest
0 голосов
/ 07 февраля 2019

Я использую Microprofile Config (@Inject, а не ConfigProvider) в моем приложении.У меня есть конфигурация, которая принимает разные ветви для разных значений.Чтобы протестировать (Arquillian) все пути в моем коде, мне нужно иметь возможность изменить это значение во время выполнения.Может кто-нибудь предложить советы, как этого добиться?Мои свойства устанавливаются с помощью системных свойств, но я открыт для идей о том, как с этим справиться.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Вы можете зарегистрировать ConfigSource, который можно легко настроить.Вы можете посмотреть на тот, который я написал для самого TC-mp-config: 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");
0 голосов
/ 08 февраля 2019

Относительно конфигурации Microprofile: Spec: Configsource , в которой упоминается следующее: -

Свойства системы (порядковый номер по умолчанию = 400).

Переменные среды (порядковый номер по умолчанию = 300).

A 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());
    }

}

EDIT1

Более того, если мы хотим получить контроль надsystem properites, Системные правила сделают нашу жизнь проще.Они предоставляют ClearSystemProperties , ProvideSystemProperty и RestoreSystemProperties в качестве следующего примера из своего документа.

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");
        ...
    }

}

...