如何在Open Liberty的ShrinkWrap+Arquillian测试中注入MicroProfile ConfigProperty
以下是针对问题的具体排查和修复步骤:
1. 确保Arquillian部署包含主资源配置文件
Arquillian托管容器测试默认只打包测试相关资源,不会自动包含src/main/resources下的文件。需要在测试类的@Deployment方法中显式添加配置文件:
@Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class, "test.war") .addClass(AppConfig.class) // 将主资源目录的配置文件加入部署包 .addAsResource("META-INF/microprofile-config.properties", "META-INF/microprofile-config.properties"); }
这里第一个参数是项目中配置文件的相对路径(基于src/main/resources),第二个参数是部署后在war包中的路径,必须保持一致才能被MP Config识别。
2. 验证配置文件的实际部署位置
部署测试后,到Liberty服务器的应用目录检查配置文件是否存在:[Liberty安装目录]/usr/servers/[测试服务器名]/apps/test.war/WEB-INF/classes/META-INF/microprofile-config.properties
如果文件不存在,说明Arquillian打包时没包含进去,需要调整addAsResource的路径参数。
3. 确认CDI Bean的托管注解
AppConfig类必须是CDI托管Bean,否则容器无法处理@Inject和@ConfigProperty注入。给类添加作用域注解,比如:
@ApplicationScoped public class AppConfig { @Inject @ConfigProperty(name = "serviceName") private String serviceName; public String getServiceName() { return serviceName; } }
4. 检查服务器特性加载状态
虽然server.xml已启用mpConfig-3.0和cdi-3.0,但要确认这些特性在测试启动时已成功加载。查看服务器启动日志,找类似CWWKF0012I: 已启动以下特性: [cdi-3.0, mpConfig-3.0, ...]的日志条目,确保特性正常启用。
5. 临时用测试资源目录验证
如果以上步骤无效,可以把microprofile-config.properties复制到src/test/resources/META-INF下,然后在@Deployment中简化为:
.addAsResource("META-INF/microprofile-config.properties");
这样可以快速验证配置是否能被读取,排除主资源目录的路径问题。
内容的提问来源于stack exchange,提问作者Scott Kurz

