Моя цель - выполнять тесты в тестовом классе только тогда, когда какое-то свойство spring, объявленное в application-foo.properties, равно некоторой константе. Я пытался достичь этого, написав свой собственный ExecutionCondition с использованием аннотации, и когда я использую его в методе @Test, он работает нормально. Но использование одного в тестовом классе приводит к проблеме: условие оценивается до того, как контекст Spring сработает.

Согласно документам:

Если ExecutionCondition отключает тестовый метод, это не препятствует созданию экземпляра тестового класса.

Но что мне делать, если я хочу?

API условий на основе скриптов и их поддерживающие реализации устарели с намерением удалить их в JUnit Jupiter 5.6. Вместо этого пользователям следует полагаться на комбинацию других встроенных условий или создавать и использовать настраиваемую реализацию ExecutionCondition для оценки тех же условий.

Начиная с версии v5.6.0, @ Включено, если аннотация была исключена. Одним из преимуществ этого является свойство loadContext(), которое позволяет буквально достичь цели данной темы. Ни одна из оставшихся аннотаций (например, EnabledIfEnvironmentVariable) содержат даже крохотную подсказку, как этого добиться. И я также не нашел никаких возможностей в Руководстве пользователя.

Буду признателен за любую помощь или совет.

1
CalmTechie 23 Июн 2020 в 19:13

1 ответ

Лучший ответ

Действительно, @EnabledIf из import org.junit.jupiter.api.condition.EnabledIf был удален в JUnit 5.6.

Существует также @EnabledIf из Spring Test import org.springframework.test.context.junit.jupiter.EnabledIf, который не является устаревшим и подходит для вашего варианта использования.

@EnabledIf(
  expression = "#{systemProperties['your.property'].toLowerCase().contains('disabled')}",
  reason = "Disabled due to property",
  loadContext = true
)
@SpringBootTest
public class MyTest {

  // your tests

}

Допустим, у вас есть свойство внутри application-foo.properties:

flaky.tests.enabled = false

Теперь вы можете условно запускать тесты с

@EnabledIf(
  expression = "${flaky.tests.enabled}",
  reason = "Disabled flaky tests",
  loadContext = true
)
@SpringBootTest
@ActiveProfiles("foo")
public class FlakyTest {

  // your tests

}

Я тестировал его с помощью Spring Boot 2.3.0, и он отлично работает без каких-либо предупреждений об устаревании.

0
rieckpil 25 Июн 2020 в 06:23