Переменная junitDisplayName не найдена в выражении @EnabledIf

#java #spring #junit #gitlab-ci

#java #весна #junit #gitlab-ci

Вопрос:

Я пытаюсь разделить свои unittests на gitlab ci runner, поэтому я хочу аннотировать свой родительский тест-cass следующим образом

 @EnabledIf("#{systemEnvironment['CI_NODE_INDEX'] == null || junitDisplayName.hashCode() % systemEnvironment['CI_NODE_TOTAL'] == systemEnvironment['CI_NODE_INDEX']}")
  

но я получаю исключение

 Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'junitDisplayName' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?
  

но в документах говорится, что должно быть такое поле: https://junit.org/junit5/docs/5.3.0/api/org/junit/jupiter/api/condition/EnabledIf.html

Ответ №1:

Я опробовал предоставленные вами фрагменты для поиска исправления, но не смог найти рабочего решения. Чтобы обойти проблему, я настроил пользовательский ExecutionCondition параметр, который пропускает тест (класс), когда отображаемое имя содержит текст «отключено», и используется @ExtendWith для включения условия в тестовый класс:

DemoApplicationTests

 package com.example.demo;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@ExtendWith(CustomExecutionCondition.class)
//@DisplayName("disabled")
class DemoApplicationTests {

    @Test
    @DisplayName("enabled")
    void shouldBeEnabled() {
    }

    @Test
    @DisplayName("disabled")
    void shouldBeDisabled() {
        throw new IllegalStateException("Should not happen");
    }
}
  
 package com.example.demo;

import org.junit.jupiter.api.extension.ConditionEvaluationResu<
import org.junit.jupiter.api.extension.ExecutionCondition;
import org.junit.jupiter.api.extension.ExtensionContext;

public class CustomExecutionCondition implements ExecutionCondition {

    @Override
    public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
        String displayName = context.getDisplayName();

//        int ciNodeIndex = Integer.parseInt(System.getProperty("CI_NODE_INDEX"));
//        int ciNodeTotal = Integer.parseInt(System.getProperty("CI_NODE_TOTAL"));

        if (displayName != null amp;amp; displayName.contains("disabled")) {
            return ConditionEvaluationResult.disabled("Test '"   displayName   "' is disabled");
        }

        return ConditionEvaluationResult.enabled("Test '"   displayName   "' is enabled");
    }
}
  

Я пропустил оценку системного свойства и хэш-кода, чтобы упростить пример. Условие вычисляется три раза; один раз для тестового класса и два раза для методов тестирования. Если оценка уровня класса возвращает false, все методы тестирования в классе пропускаются.