Моя цель - выполнять тесты в тестовом классе только тогда, когда какое-то свойство spring, объявленное в application-foo.properties
, равно некоторой константе. Я пытался достичь этого, написав свой собственный ExecutionCondition с использованием аннотации, и когда я использую его в методе @Test
, он работает нормально. Но использование одного в тестовом классе приводит к проблеме: условие оценивается до того, как контекст Spring сработает.
Согласно документам:
Если ExecutionCondition отключает тестовый метод, это не препятствует созданию экземпляра тестового класса.
Но что мне делать, если я хочу?
API условий на основе скриптов и их поддерживающие реализации устарели с намерением удалить их в JUnit Jupiter 5.6. Вместо этого пользователям следует полагаться на комбинацию других встроенных условий или создавать и использовать настраиваемую реализацию ExecutionCondition для оценки тех же условий.
Начиная с версии v5.6.0, @ Включено, если аннотация была исключена. Одним из преимуществ этого является свойство loadContext()
, которое позволяет буквально достичь цели данной темы. Ни одна из оставшихся аннотаций (например, EnabledIfEnvironmentVariable) содержат даже крохотную подсказку, как этого добиться. И я также не нашел никаких возможностей в Руководстве пользователя.
Буду признателен за любую помощь или совет.
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, и он отлично работает без каких-либо предупреждений об устаревании.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.