如何在不使用@QuarkusTest的测试中使用@ConfigMapping?
问题描述
我有一个标注了@ConfigMapping(prefix = "myconfig")的MyConfig接口,用来从src/main/resources/application.properties读取配置。写单元测试的时候,因为配置项太多不想Mock这个接口,就照着SmallRye Config文档的写法获取实例:
final SmallRyeConfig sconfig = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class); final MyConfig config = sconfig.getConfigMapping(MyConfig.class);
结果运行报错:
java.util.NoSuchElementException: SRCFG00027: Could not find a mapping for com.natixis.matrisk.api.management.releases.config.ReleaseConfig at io.smallrye.config.SmallRyeConfig.getConfigMapping(SmallRyeConfig.java:683) at io.smallrye.config.SmallRyeConfig.getConfigMapping(SmallRyeConfig.java:673)
可能的原因及解决办法
- SmallRye Config没扫到你的MyConfig接口:单元测试环境里,默认的ConfigProvider不一定会自动识别你的配置映射接口。别用
ConfigProvider.getConfig(),手动构建SmallRyeConfig实例,主动指定要加载的映射和配置文件:
SmallRyeConfig config = new SmallRyeConfigBuilder() .withMapping(MyConfig.class) .withSources(PropertiesConfigSourceProvider.fromClasspath("application.properties", true)) .build(); MyConfig myConfig = config.getConfigMapping(MyConfig.class);
- 测试环境没加载到正确的配置文件:单元测试时,
src/main/resources下的配置文件可能没被自动加载,或者被测试目录的配置覆盖了。先确认测试类路径里能找到application.properties,或者像上面那样手动指定加载这个文件。 - MyConfig接口的写法不符合要求:检查下你的配置映射接口是不是符合规范:
- 必须是public接口
- 方法返回值只能是基本类型、String、其他配置映射接口,或者Optional/集合类
@ConfigMapping的prefix要和配置文件里的键前缀完全一致(默认大小写敏感,别写错)
- 依赖有问题:确保测试依赖里的smallrye-config版本正确,没有和其他配置类冲突。如果是Quarkus项目,直接用框架自带的SmallRye Config,别自己瞎引别的版本。
内容的提问来源于stack exchange,提问作者Cristiano
相关产品推荐
相关产品推荐

