Микропрофиль | Config - Тестирование с динамическими значениями
Я использую Microprofile Config (@Inject
не ConfigProvider
) в моем приложении. У меня есть конфигурация, которая принимает разные ветви для разных значений. Для того, чтобы проверить (Arquillian
) все пути в моем коде, я должен иметь возможность изменить это значение во время выполнения. Может кто-нибудь подсказать, как этого добиться? Мои свойства устанавливаются с помощью системных свойств, но я открыт для идей о том, как справиться с этим.
1 ответ
Вы можете зарегистрировать 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");
Относительно конфигурации Microprofile: 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());
}
}
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");
...
}
}