根据常量值执行JUnit

Execute JUnit based on Constant value

我有这个 class 和定义的常量

public class Constants {
    public static final boolean TEST = true;
}

我想检查一下这个常数是否为 TRUE,如下所示:

@Test
@EnabledIf("'true' == Constants.TEST")
public void theMeasurementSampleScreenFromPickConfirm() throws InterruptedException {
   // some code execution
}

但是我得到错误java.lang.NoSuchMethodError: 'java.lang.reflect.Method org.junit.platform.commons.util.ReflectionUtils.getRequiredMethod(java.lang.Class, java.lang.String, java.lang.Class[])'

你知道我如何正确地执行这个检查吗?

使用Spring的@EnabledIf时,可以使用SpEL表达式。参见 @EnabledIf With a SpEL Expression

要引用常量,请使用 T operator from SpEL

You can use the special T operator to specify an instance of java.lang.Class (the type). Static methods are invoked by using this operator as well

另请注意,您的 TEST 常量是布尔值,而不是字符串。

结合以上你可以使用:

@EnabledIf("#{T(com.sandbox.Constants).TEST == true}")

甚至

@EnabledIf("#{T(com.sandbox.Constants).TEST}")

不要在比较布尔值时使用单引号。

解决方案 1: 在注释本身中附加值。

@Test
@EnabledIf("#{" + Constants.TEST + "}")
public void theMeasurementSampleScreenFromPickConfirm() throws InterruptedException {
   // some code execution
}

解决方案 2: 使用 Spring 表达式语言,您可以使用 Type 运算符,方法是提供class。例如:如果 Constants class 在 com.example 包中,则

@Test
@EnabledIf("#{T(com.example.Constants).TEST}")
public void theMeasurementSampleScreenFromPickConfirm() throws InterruptedException {
       // some code execution
}

注意: 这仅适用于具有 Spring 启动启动器测试的 Spring 项目(内部使用 JUnit 默认情况下)支持,因为如果它是非 spring 项目,则无法评估 SpELJUnit 不支持在没有 Spring 的情况下对 SpEL 进行独立评估。

因此,使用 spring-boot-starter-test 创建一个 spring 引导项目,并使用 spring-boot-starter-test 中的 @EnabledIf 注释,它能够评估 Spring 表达式语言。