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中,以便在不同线程之间进行隔离。