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
相关产品推荐
相关产品推荐

