如何在Quarkus单元测试中通过@ConfigMapping修改应用配置?
如何在Quarkus单元测试中通过@ConfigMapping修改应用配置?
哈,刚好我之前在Quarkus里用@ConfigMapping的时候,也遇到过要在单元测试里改配置测负面场景的需求,给你分享几个亲测有效的办法,不用绕弯路:
1. 最省心:用@ModifyConfigProperty直接覆盖
如果你用的是Quarkus 2.7及以上版本,直接用**@ModifyConfigProperty**注解就搞定了,这是Quarkus官方专门为测试场景提供的配置覆盖工具,完全不用自己折腾系统属性。
比如你要给单个测试方法改配置:
import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.ModifyConfigProperty; import org.junit.jupiter.api.Test; import jakarta.inject.Inject; @QuarkusTest public class MyPropertiesTest { @Inject MyPropertiesMapping myProperties; @Test @ModifyConfigProperty(name = "myapp.prop", value = "newNegativeValue") public void testNegativeCase() { // 先验证配置确实改了 assert myProperties.prop().equals("newNegativeValue"); // 这里写你的负面场景测试逻辑就好 } }
要是多个测试方法想用同一个测试配置,直接把@ModifyConfigProperty标注在测试类上就行,所有测试方法都会生效。
2. 静态测试配置:用测试专用的application-test.properties
如果你的所有测试用例都要用同一套测试配置,那更简单——直接在src/test/resources下新建一个application-test.properties文件,里面写测试环境的配置值:
myapp.prop = fixedTestValue
Quarkus在运行测试的时候,会自动优先加载这个测试目录下的配置文件,覆盖主代码里的application.properties配置。
3. 为什么你之前用@BeforeAll设系统属性没效果?
你之前尝试在@BeforeAll里用System.setProperty()没成功,是因为Quarkus的测试上下文在启动的时候就已经加载完所有配置了,而@BeforeAll是在上下文启动之后才执行的,这时候改系统属性根本赶不上配置加载的时机。
如果一定要用动态配置分组(比如不同测试组用不同配置),可以用QuarkusTestProfile:
首先创建一个测试配置类:
import io.quarkus.test.junit.QuarkusTestProfile; import java.util.Map; public class NegativeTestProfile implements QuarkusTestProfile { @Override public Map<String, String> getConfigOverrides() { // 这里返回你要覆盖的配置键值对 return Map.of("myapp.prop", "profileTestValue"); } }
然后在测试类上指定用这个配置文件:
import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; import org.junit.jupiter.api.Test; import jakarta.inject.Inject; @QuarkusTest @TestProfile(NegativeTestProfile.class) public class MyGroupedTest { @Inject MyPropertiesMapping myProperties; @Test public void testWithProfileConfig() { assert myProperties.prop().equals("profileTestValue"); // 测试逻辑 } }
这种方式适合给不同的测试场景分组配置,管理起来更清晰。
内容来源于stack exchange
相关产品推荐
相关产品推荐

