Spring Boot: @TestPropertySource не загружен из импортированной конфигурации

Используя Spring Boot 1.5.16 в WebMvcTest, я пытаюсь загрузить test.properties, применяя аннотацию @TestPropertySource, чтобы переопределить некоторые свойства в тестовом классе. Это отлично работает, если я помещу его в тестовый класс:

@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test.properties")
public class ControllerTest {
    ...
}

Но свойства не загружаются, если я перемещаю его в импортированную конфигурацию:

@RunWith(SpringRunner.class)
@WebMvcTest
@Import(ControllersConfiguration.class)
public class ControllerTest {
    ...
}

а класс ControllersConfiguration:

@TestConfiguration
@TestPropertySource("classpath:test.properties")
public class ControllersConfiguration {
    ...
}

Вы можете объяснить такое поведение?

P.S. Аннотация @PropertySource работает в импортированной конфигурации, но с более низким приоритетом, чем application.properties

UPD: Для ясности - попробуйте пройти все тесты здесь: https://github.com/Javasick/WeirdTestPropertySource

вы пробовали ставить inheritLocations вместо @TestPropertySource как false?

vlad324 03.12.2018 14:33

Да не помогает

Javasick 03.12.2018 15:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
1 178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из JavaDocs:

Enabling @TestPropertySource @TestPropertySource is enabled if the configured context loader honors it.

Every SmartContextLoader that is a subclass of either AbstractGenericContextLoader or AbstractGenericWebContextLoader provides automatic support for @TestPropertySource, and this includes every SmartContextLoader provided by the Spring TestContext Framework.

Итог:

Typically, @TestPropertySource will be used in conjunction with @ContextConfiguration.

Итак, вы должны аннотировать свой тестовый класс с помощью @ContextConfiguration

Пробовал поставить @ContextConfiguration и не получается

Javasick 03.12.2018 15:01

Кстати, тест работает, но добавление свойств в импортированную конфигурацию - нет

Javasick 03.12.2018 15:59
Ответ принят как подходящий

Я исследовал это вчера и обнаружил, что Spring ищет эту аннотацию @TestPropertySource только на:

  • Исходный тестовый класс
  • Интерфейсы, если их реализует тестовый класс
  • Суперклассы этого тестового класса
  • Унаследованные аннотации

Вот часть кода AbstractTestContextBootstrapper.class, который за это отвечает:

MergedTestPropertySources mergedTestPropertySources =
        TestPropertySourceUtils.buildMergedTestPropertySources(testClass);
MergedContextConfiguration mergedConfig = new MergedContextConfiguration(testClass,
        StringUtils.toStringArray(locations),
        ClassUtils.toClassArray(classes),
        ApplicationContextInitializerUtils.resolveInitializerClasses(configAttributesList),
        ActiveProfilesUtils.resolveActiveProfiles(testClass),
        mergedTestPropertySources.getLocations(),
        mergedTestPropertySources.getProperties(),
        contextCustomizers, contextLoader, cacheAwareContextLoaderDelegate, parentConfig);

Метод TestPropertySourceUtils.buildMergedTestPropertySources(testClass) как раз отвечает за поиск и извлечение местоположения из этой аннотации. Как видите, Spring вызывает его только в тестовом классе.

Поэтому, если вы хотите вывести эту аннотацию на внешний вид, вам нужно создать суперкласс и поместить на него эту аннотацию и @Import, или создать интерфейс с этой аннотацией, или создать свою собственную аннотацию, которая объединит две аннотации @Import и @TestPropertySource и поместит ее в ваши тестовые классы. .

Спасибо, это ответ, который я искал

Javasick 05.12.2018 09:45

Другие вопросы по теме