Spring TestPropertySource не работает. Не работает с интерфейсами или через классы SpringBootTest - PullRequest
0 голосов
/ 27 марта 2019

Вопрос

Как добавить аннотации 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 {
}

Вот что мы ожидали:

  1. Запустить тестовый класс
  2. FunctionalTestConfiguration подключается через SpringBootTest.classes
  3. @ TestPropertySource считывается из класса FunctionalTestConfiguration.
  4. Значения в 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 для принудительного переопределения значения. У кого-нибудь есть идеи о том, что я делаю неправильно / лучший способ сделать это?

...