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

Spring Boot Kotlin的Cucumber测试中Togglz使用FallbackTestFeatureManager异常问题

解决思路与排查步骤

1. 禁用Togglz测试自动配置

test scope的togglz-testing依赖会自动注册优先级更高的TestFeatureManagerProvider,会覆盖生产环境的FeatureManager配置,而Cucumber测试默认会加载所有Test相关自动配置,这大概率是问题根源。

  • 解决方式:在Cucumber测试的配置类中排除TogglzTestingAutoConfiguration:
    @SpringBootTest
    @EnableAutoConfiguration(exclude = [TogglzTestingAutoConfiguration::class])
    @CucumberContextConfiguration
    class CucumberTestConfig
    

2. 验证Cucumber的配置加载

确认src/test/resources/application.yaml中的Togglz配置被正确读取:

  • 在测试类中注入Environment,打印togglz.*相关配置项,验证配置是否生效;
  • 确保测试启动时没有通过命令行或注解指定其他配置源,覆盖了原有配置。

3. 提升自定义FeatureManager的优先级

如果自动配置的Bean被覆盖,手动创建自定义FeatureManager Bean并标记@Primary,确保它被Cucumber上下文优先选中:

@Configuration
class TogglzConfig {
    @Bean
    @Primary
    fun featureManager(stateRepository: StateRepository, featureProvider: FeatureProvider): FeatureManager {
        return FeatureManagerBuilder()
            .stateRepository(stateRepository)
            .featureProvider(featureProvider)
            .build()
    }
}

4. 检查Feature枚举的isActive实现

确认Feature枚举的isActive方法没有错误绑定测试用FeatureManager:

  • 避免硬编码调用FeatureContext.getTestFeatureManager(),正确写法应为:
    enum class MyFeatures : Feature {
        @EnabledByDefault
        FEATURE_A;
    
        override fun isActive(): Boolean {
            return FeatureContext.getFeatureManager().isActive(this)
        }
    }
    

5. 清除Cucumber上下文缓存

Cucumber会缓存测试上下文,若之前的测试类使用了togglz-testing配置,可能导致上下文复用影响后续测试:

  • 在测试类上添加@DirtiesContext注解,强制每次测试重新加载上下文。

内容的提问来源于stack exchange,提问作者chicarrida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:07:47