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 实现更精细的环境控制。


原始标题:Spring 5 Testing with @EnabledIf Annotation