使用@EnabledIf注解进行Spring 5测试

2023/05/10

1. 概述

在这篇简短的文章中,我们将介绍Spring 5中的@EnabledIf和@DisabledIf注解。

简单地说,如果满足指定条件,这些注解可以禁用/启用特定测试

我们将使用一个简单的测试类来演示这些注解是如何工作的:

@SpringJUnitConfig(Spring5EnabledAnnotationIntegrationTest.Config.class)
class Spring5EnabledAnnotationIntegrationTest {

    @Configuration
    static class Config {
    }
}

2. @EnabledIf

让我们将这个简单的测试添加到我们的类中:

@EnabledIf("true")
@Test
void givenEnabledIfLiteral_WhenTrue_ThenTestExecuted() {
    assertTrue(true);
}

如果我们运行这个测试,它会正常执行。

但是,如果我们将@EnabledIf注解中提供的字符串替换为“false”,则不会执行

请记住,如果你想静态禁用测试,则有一个专用的@Disabled注解。

3. @EnabledIf使用属性占位符

使用@EnabledIf更实用的方法是使用属性占位符:

@EnabledIf(expression = "${tests.enabled}", loadContext = true)
@Test
void givenEnabledIfExpression_WhenTrue_ThenTestExecuted() {
    assertTrue(true);
}

首先,我们需要确保loadContext参数设置为true以便加载Spring上下文。

默认情况下,此参数设置为false,这是为了避免不必要的上下文加载。

4. @EnabledIf使用SpEL表达式

最后,我们可以将注解与Spring表达式语言(SpEL)表达式一起使用

例如,我们可以仅在JDK为17时启用测试:

@EnabledIf("#{systemProperties['java.version'].startsWith('17')}")
@Test
void givenEnabledIfSpel_WhenTrue_ThenTestExecuted() {
    assertTrue(true);
}

5. @DisabledIf

此注解与@EnabledIf的作用相反

例如,我们可以指定在Java的版本为8时禁用测试:

@DisabledIf("#{systemProperties['java.version'].startsWith('8')}")
@Test
void givenDisabledIf_WhenTrue_ThenTestNotExecuted() {
    assertTrue(true);
}

6. 自定义注解

我们也可以将这些注解作用于自己定义的注解上,这样就可以实现重用性

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
      expression = "#{systemProperties['java.version'].startsWith('1.8')}",
      reason = "Enabled on Java 8"
)
public @interface EnabledOnJava8 {
}

然后我们可以直接使用自定义的注解:

@EnabledOnJava17
@Test
void givenEnabledOnJava8_WhenTrue_ThenTestExecuted() {
    assertTrue(true);
}

7. 总结

在这篇简短的文章中,我们通过几个示例介绍了在使用SpringExtension的JUnit 5测试中使用@EnabledIf和@DisabledIf注解。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章