Используя 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
Да не помогает




Из 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 и не получается
Кстати, тест работает, но добавление свойств в импортированную конфигурацию - нет
Я исследовал это вчера и обнаружил, что 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 и поместит ее в ваши тестовые классы. .
Спасибо, это ответ, который я искал
вы пробовали ставить
inheritLocationsвместо@TestPropertySourceкакfalse?