1. 简介
本文将介绍 Spring 5 中 @EnabledIf
和 @DisabledIf
注解的使用方法,结合 JUnit 5 实现条件化测试。
简单来说,这两个注解允许我们在满足特定条件时动态启用或禁用测试用例。
我们通过一个基础测试类演示其用法:
@SpringJUnitConfig(Spring5EnabledAnnotationIntegrationTest.Config.class)
public class Spring5EnabledAnnotationIntegrationTest {
@Configuration
static class Config {}
}
2. @EnabledIf
基础用法
先看一个最简单的例子,使用字符串字面量 "true"
:
@EnabledIf("true")
@Test
void givenEnabledIfLiteral_WhenTrue_ThenTestExecuted() {
assertTrue(true);
}
运行此测试会正常执行。
但若将字符串改为 "false"
,测试将被跳过:
⚠️ 注意:若需静态禁用测试,应使用 JUnit 5 原生的 @Disabled
注解。
3. 结合属性占位符使用
更实用的场景是结合属性占位符:
@Test
@EnabledIf(
expression = "${tests.enabled}",
loadContext = true)
void givenEnabledIfExpression_WhenTrue_ThenTestExecuted() {
// ...
}
关键点:
- ✅ 必须设置
loadContext = true
加载 Spring 上下文 - ❌ 默认值为
false
,避免不必要的上下文加载(性能优化)
4. 结合 SpEL 表达式使用
最强大的功能是支持 Spring Expression Language (SpEL)
例如:仅在 JDK 1.8 环境下执行测试:
@Test
@EnabledIf("#{systemProperties['java.version'].startsWith('1.8')}")
void givenEnabledIfSpel_WhenTrue_ThenTestExecuted() {
assertTrue(true);
}
常见 SpEL 场景:
- 系统属性判断:
#{systemProperties['os.name'].contains('Windows')}
- 环境变量检查:
#{environment['CI'] == 'true'}
- 自定义 Bean 方法:
#{@testConditionChecker.isTestEnabled()}
5. @DisabledIf
反向控制
@DisabledIf
与 @EnabledIf
完全相反,用于条件禁用测试。
例如:在 Java 1.7 环境下跳过测试:
@Test
@DisabledIf("#{systemProperties['java.version'].startsWith('1.7')}")
void givenDisabledIf_WhenTrue_ThenTestNotExecuted() {
assertTrue(true);
}
实际应用场景:
- 跳过特定数据库环境的测试
- 避免在 CI 环境运行耗时测试
- 根据外部服务可用性控制测试
6. 总结
本文通过多个示例展示了 Spring 5 中条件化测试的核心技巧:
- ✅
@EnabledIf
/@DisabledIf
提供灵活的测试控制 - ✅ 支持字面量、属性占位符和 SpEL 表达式
- ✅ 需注意
loadContext
参数对性能的影响 - ✅ 适合多环境/多条件测试场景
完整示例代码可在 GitHub 获取。实际使用时建议结合 Spring Profile 实现更精细的环境控制。