如何在Kotlin集成测试中切换Unleash功能开关?
集成测试中切换Unleash功能开关的方案
针对你使用Unleash Kotlin客户端进行集成测试(结合MockMvc、MockServerClient)时的开关切换需求,以下是几种实用方案:
方法1:本地静态配置(全局生效)
在集成测试的配置类中,初始化一个本地Unleash实例,直接指定功能开关的状态,完全绕过远程服务:
@TestConfiguration class UnleashTestConfig { @Bean fun unleash(): Unleash { // 按需定义所有需要测试的开关状态 val toggleConfigs = mapOf( "payment-v2" to true, "new-ui" to false ) return Unleash.builder() .toggles(toggleConfigs) .build() } }
所有集成测试会自动使用这个配置,无需依赖外部Unleash服务。
方法2:单用例动态控制
如果需要在单个测试用例中灵活切换开关状态,可以注入Unleash实例后调用updateToggle方法:
@Autowired private lateinit var unleash: Unleash @Autowired private lateinit var mockMvc: MockMvc @Test fun `verify payment v2 flow when enabled`() { // 启用目标开关 unleash.updateToggle("payment-v2", true) // 执行API请求验证逻辑 mockMvc.perform(post("/api/payments") .contentType(MediaType.APPLICATION_JSON) .content("{\"amount\":100}")) .andExpect(status().isOk) .andExpect(jsonPath("$.version").value("v2")) } @Test fun `fallback to v1 payment when feature disabled`() { // 禁用目标开关 unleash.updateToggle("payment-v2", false) mockMvc.perform(post("/api/payments") .contentType(MediaType.APPLICATION_JSON) .content("{\"amount\":100}")) .andExpect(status().isOk) .andExpect(jsonPath("$.version").value("v1")) }
为避免用例间状态污染,建议在每个测试前重置开关:
@BeforeEach fun resetToggles() { unleash.updateToggle("payment-v2", false) // 重置其他测试开关... }
方法3:MockServer模拟Unleash服务响应
利用你已有的MockServerClient,模拟Unleash客户端的接口请求,返回自定义的开关配置,更贴近真实场景:
@Autowired private lateinit var mockServerClient: MockServerClient @BeforeEach fun mockUnleashFeatureResponse() { // 构造Unleash服务返回的开关配置JSON val featureResponse = """ { "features": [ { "name": "payment-v2", "enabled": true, "strategies": [{"name": "default"}] }, { "name": "new-ui", "enabled": false, "strategies": [{"name": "default"}] } ] } """.trimIndent() // 匹配Unleash客户端的特征请求接口 mockServerClient.`when`( request() .withMethod("GET") .withPath("/api/client/features") ).respond( response() .withStatusCode(200) .withHeader("Content-Type", "application/json") .withBody(featureResponse) ) }
这种方式适合需要验证Unleash客户端拉取配置逻辑的集成测试。
内容的提问来源于stack exchange,提问作者shubham saxena
相关产品推荐
相关产品推荐

