Java 微文件|配置-使用动态值进行测试

Java 微文件|配置-使用动态值进行测试,java,jboss-arquillian,apache-tomee,microprofile,tomee-8,Java,Jboss Arquillian,Apache Tomee,Microprofile,Tomee 8,我在应用程序中使用的是微文件配置(@Inject,而不是ConfigProvider)。我有一个配置,为不同的值采用不同的分支。为了测试(Arquillian)代码中的所有路径,我需要能够在运行时更改此值。有人能提供一些如何做到这一点的建议吗?我的属性是使用系统属性设置的,但我对如何处理这个问题持开放态度。关于以下内容:- 系统属性(默认序号=400) 环境变量(默认序号=300) 每个属性文件的配置源 在类路径上找到META-INF/microprofile-config.properties

我在应用程序中使用的是微文件配置(
@Inject
,而不是
ConfigProvider
)。我有一个配置,为不同的值采用不同的分支。为了测试(
Arquillian
)代码中的所有路径,我需要能够在运行时更改此值。有人能提供一些如何做到这一点的建议吗?我的属性是使用系统属性设置的,但我对如何处理这个问题持开放态度。

关于以下内容:-

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

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

每个属性文件的配置源 在类路径上找到META-INF/microprofile-config.properties。 (默认序号=100)

这意味着
系统属性在这里是最高优先级的。然后,我们可以在
META-INF/microfile config.properties
中设置默认值,如果系统属性需要,可以替代它

在集成测试期间,我们可以设置
系统属性
,并使用
javax.inject.Provider
使其动态检索,以便覆盖默认值,如下例所示:-

#META-INF/microfile-config.properties
my.key=原创
import javax.inject.inject;
导入javax.inject.Provider;
导入org.eclipse.microfile.config.inject.ConfigProperty;
公共类{
@注入
@配置属性(
name=“my.key”
)
私有提供者密钥1;
公共字符串doSomethingWithConfig(){
return键1.get();
}
}
import javax.inject.inject;
导入org.jboss.arquillian.junit.arquillian;
导入org.jboss.arquillian.junit.InSequence;
导入org.junit.Test;
导入org.junit.Assert;
@RunWith(Arquillian.class)
公共类SomeClassTester{
@注入
私人某类某类;
@试验
@顺序(1)
public void whenTestDefaultConfig(){
Assert.assertEquals(“该值必须是defualt。”,
“原件”,
this.someclass.doSomethingWithConfig());
}
@试验
@顺序(2)
public void whenTestOverrideMPConfig(){
System.setProperty(“my.key”,
“新价值”);
Assert.assertEquals(“必须重写该值”,
“新价值”,
this.someclass.doSomethingWithConfig());
}
}
编辑1 此外,如果我们想控制
系统属性
,则将使我们的生活更轻松。他们提供了,并在他们的文档中提供了以下示例

公共类MyTest{
@统治
公共最终恢复系统属性恢复系统属性
=新的RestoreSystemProperty();
@试验
公共无效覆盖属性(){
//测试后,“MyProperty”的原始值将恢复。
System.setProperty(“MyProperty”、“其他值”);
...
}

}

您可以注册一个可以轻松配置的
ConfigSource
。 您可以查看我为mp config TCK本身编写的一个:

要将此ConfigSource添加到Arquillian@Deployment,请检查此测试:

重要的方面是:

.addClass(ConfigurableConfigSource.class)
.addAsServiceProvider(ConfigSource.class, ConfigurableConfigSource.class)
然后调整值

ConfigurableConfigSource.configure(config, "my.config.entry", "some new value");

对于这个实现,我唯一关心的是它是否适用于简单的bean值,例如。你能解决这个问题吗?另外,
onatributechange
似乎还没有发布版本,所以我会急切地等待它的到来。你不需要
onatributechange
来完成你想要的任务。它就在那里,因为当前的TCK已经实现了更新的mp配置API。把这部分删掉。关于@Dependent SimpleValuesBean:当然,如果您将java本机类型注入到类中,那么它将不会在基础配置中拾取任何更改,因为它是final。例如,使用提供程序。
System.setProperty
肯定会起作用。但是在并行运行测试时要小心。您可以使用自己的自定义ConfigurableConfigSource将配置存储在@RequestScoped bean中,以便在不同线程之间进行隔离。