Вопрос
Как добавить аннотации TestPropertySource с намерением переопределить значения свойств в среде ApplicationContext, не добавляя его в сам тестовый класс или его суперклассы?
Наши настройки
Мы обновляем с весны 4.3.x и загружаем 1.5.x до весны 5.1.5 и загружаемся 2.1.3. Вот код, который работал до обновления:
Класс с тестами в нем:
@RunWith(SpringRunner.class)
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = {Application.class, FunctionalTestConfiguration.class}
)
public class HeaderManagementTest extends BaseServiceTest {
...
}
Класс применения:
@SpringBootApplication(...)
@Configuration
@ComponentScan(...)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, RibbonAutoConfiguration.class})
public class Application{
...
}
И ключ ко всему этому, класс FunctionalTestConfiguration:
@Configuration
@ComponentScan(basePackages = {...})
@TestPropertySource(locations = {"classpath:functional-test.properties"})
public class FunctionalTestConfiguration {
}
Вот что мы ожидали:
- Запустить тестовый класс
- FunctionalTestConfiguration подключается через
SpringBootTest.classes
- @ TestPropertySource считывается из класса FunctionalTestConfiguration.
- Значения в functions-test.properties имеют приоритет над всеми другими значениями, считанными из application.properties или других источников.
Опять же, это работало до обновления. Я только что провел два дня в черной дыре исходного кода StackOverflow / Spring, и большая часть этой информации на самом деле неверна.
Исследования
В этой записи " Spring Boot: @TestPropertySource не загружен из импортированной конфигурации " говорится:
Я исследовал это вчера и обнаружил, что Spring ищет эту аннотацию @TestPropertySource только для:
- Исходный тестовый класс
- Интерфейсы, если тестовый класс реализует их
- Суперклассы этого тестового класса
- Наследственные аннотации
Однако в ходе моего тестирования я обнаружил, что TestPropertySource теперь, похоже, работает только в том случае, если он представляет собой исходный класс тестирования или его суперклассы. Похоже, аннотация больше не воспринимается интерфейсами.
Я предполагаю, что проблема связана с этой ошибкой из TestPropertySource javadoc в том, что некоторые изменения были внесены в новые версии загрузки Spring и Spring, где больше не используются правильные загрузчики классов при извлечении интерфейсы или чтение записи classes
из @SpringBootTest
.
Включение @ TestPropertySource
@TestPropertySource включается, если настроенный загрузчик контекста учитывает это. Каждый SmartContextLoader, который является подклассом AbstractGenericContextLoader или AbstractGenericWebContextLoader, обеспечивает автоматическую поддержку @TestPropertySource, и это включает в себя каждый SmartContextLoader, предоставляемый Spring TestContext Framework.
Моя проблема здесь в том, что у нас есть библиотека поддержки тестирования, которая обеспечивает большую часть проводки, обычно выполняемой в каждом классе тестирования. Я хочу иметь возможность переопределять значения среды приложения из библиотеки с минимальной инвазивностью к реальному тестовому коду. Я бы предпочел сделать это простым обычным для Spring способом, а не, например, кодировать класс EnvironmentPostProcessor для принудительного переопределения значения. У кого-нибудь есть идеи о том, что я делаю неправильно / лучший способ сделать это?