You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:12:12