Spring Boot позволяет нам заменять наши файлы application.properties эквивалентами YAML. Однако я, кажется, натолкнулся на препятствия с моими тестами. Если я аннотирую свою TestConfiguration
(простую конфигурацию Java), она ожидает файл свойств.
Например, это не работает:
@PropertySource(value = "classpath:application-test.yml")
Если у меня есть это в моем YAML-файле:
db:
url: jdbc:oracle:thin:@pathToMyDb
username: someUser
password: fakePassword
И я бы использовал эти значения примерно так:
@Value("${db.username}") String username
Однако я получаю такую ошибку:
Could not resolve placeholder 'db.username' in string value "${db.username}"
Как я могу использовать достоинства YAML в своих тестах?
spring
spring-boot
чеки
источник
источник
Ответы:
У Spring-boot есть помощник для этого, просто добавьте
в верхней части ваших тестовых классов или абстрактного тестового суперкласса.
Изменить: я написал этот ответ пять лет назад. Он не работает с последними версиями Spring Boot. Вот что я делаю сейчас (при необходимости переведите Kotlin на Java):
добавляется вверху, затем
к контексту.
источник
@SpringJUnitConfig(value = {...}, initializers = {ConfigFileApplicationContextInitializer.class})
Как уже упоминалось
@PropertySource
, файл yaml не загружается. В качестве обходного пути загрузите файл самостоятельно и добавьте загруженные свойства вEnvironment
.Реализовать
ApplicationContextInitializer
:Добавьте свой инициализатор в свой тест:
источник
YamlFileApplicationContextInitializer
классом, в котором местоположение YAML определяется для каждого тестового примера. Если вы думаете, что это интересно, не стесняйтесь объединить его в свой ответ, и я удалю свой. Просто дайте мне знать в комментарии под моим ответом.@PropertySource
можно настроитьfactory
аргументом. Итак, вы можете сделать что-то вроде:Где
YamlPropertyLoaderFactory
находится ваш пользовательский загрузчик свойств:На основе https://stackoverflow.com/a/45882447/4527110
источник
IllegalStateException
когда файл не существует, а не правильныйFileNotFoundException
- поэтому для того, чтобы это работало@PropertySource(..., ignoreResourceNotFound = true)
, вам нужно поймать и обработать этот случай:try { return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource(), null); } catch (IllegalStateException e) { throw (IOException) e.getCause(); }
CompositePropertySource propertySource = new CompositePropertySource(name); new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()).stream().forEach(propertySource::addPropertySource); return propertySource;
@PropertySource
поддерживает только файлы свойств (это ограничение Spring, а не самой Boot). Не стесняйтесь открывать тикет запроса функции в JIRA .источник
ApplicationContextInitializer
и добавить его в тестовую конфигурацию (просто используйтеYamlPropertySourceLoader
для улучшенияEnvironment
). Лично я бы предпочел, если@PropertySource
бы он поддерживал такое поведение изначально.Другой вариант - установить
spring.config.location
сквозное@TestPropertySource
:источник
@TestPropertySource(properties = {"spring.config.location=classpath:application-${test.env}.yml" })
Ваш IMO - лучший ответ из всех.@TestPropertySource(properties = {"spring.config.location=classpath:application-config.yml,classpath:test-config.yml,..." })
@SpringBootTest
аннотацияНачиная с Spring Boot 1.4, вы можете использовать новую
@SpringBootTest
аннотацию для более простого достижения этой цели (и для упрощения настройки вашего интеграционного теста в целом) путем начальной загрузки ваших интеграционных тестов с использованием поддержки Spring Boot.Подробности в весеннем блоге .
Насколько я могу судить, это означает, что вы получаете все преимущества внешнего вида конфигурации Spring Boot, как и в вашем производственном коде, включая автоматическое получение конфигурации YAML из пути к классам.
По умолчанию эта аннотация будет
но при необходимости вы можете указать другие классы конфигурации.
В этом конкретном случае вы можете комбинировать
@SpringBootTest
с,@ActiveProfiles( "test" )
и Spring подберет вашу конфигурацию YAML, при условии, что она соответствует обычным стандартам именования загрузки (т.е.application-test.yml
).Примечание:
SpringRunner.class
это новое название дляSpringJUnit4ClassRunner.class
источник
Подход к загрузке свойств yaml, ИМХО, можно сделать двумя способами:
а. Вы можете поместить конфигурацию в стандартное место -
application.yml
в корне пути к классам - как правило,src/main/resources
и это свойство yaml должно автоматически загружаться при загрузке Spring с указанным вами сглаженным именем пути.б. Второй подход немного более обширен, в основном определите класс для хранения ваших свойств следующим образом:
По сути, это означает загрузку файла yaml и заполнение класса DbProperties на основе корневого элемента «db».
Теперь, чтобы использовать его в любом классе, вам нужно будет сделать следующее:
Любой из этих подходов должен работать для вас, используя Spring-boot.
источник
snakeyaml
используется в качестве транзитивной зависимости byspring-boot-starter
, поэтому нет необходимости добавлять его в вашpom.xml
илиbuild.gradle
, если у вас нет глубокого желания использовать другую версию. :)locations
нетpath
, иConfigFileApplicationContextInitializer
тоже требуется.Я нашел обходной путь,
@ActiveProfiles("test")
добавив файл application-test.yml в src / test / resources.В итоге это выглядело так:
Файл application-test.yml просто содержит свойства, которые я хочу переопределить из application.yml (которые можно найти в src / main / resources).
источник
@Value("${my.property}")
но он работает нормально, если я используюenvironment.getProperty("my.property")
.это потому что вы не настроили snakeyml. весенняя загрузка поставляется с функцией @EnableAutoConfiguration. при вызове этой аннотации тоже есть конфигурация snakeyml ..
это мой путь:
вот мой тест:
источник
Мне нужно было прочитать некоторые свойства в моем коде, и это работает с spring -boot 1.3.0.RELEASE
источник
Загрузка пользовательского файла yml с конфигурацией нескольких профилей в Spring Boot.
1) Добавьте компонент свойств с запуском SpringBootApplication следующим образом
2) Настройте объект Java pojo следующим образом
3) Создайте собственный yml (и поместите его в путь к ресурсам следующим образом: Имя файла YML: test-service-config.yml
Например, Config в файле yml.
источник
У меня была конкретная ситуация, когда я не мог загрузить класс @ConfigurationProperties из-за настраиваемого именования свойств файла. В конце единственное, что сработало (спасибо @Mateusz Balbus):
источник
Добро пожаловать в мою библиотеку. Теперь поддерживается yaml , toml , hocon .
Источник: github.com
источник
Это не ответ на исходный вопрос, а альтернативное решение при необходимости иметь другую конфигурацию в тесте ...
Вместо этого
@PropertySource
можно использовать-Dspring.config.additional-location=classpath:application-tests.yml
.Имейте в
tests
виду , что этот суффикс не означает профиль ...В этом одном файле YAML можно указать несколько профилей, которые могут наследовать друг от друга, подробнее здесь - Разрешение свойств для нескольких профилей Spring (конфигурация yaml)
Затем, вы можете указать в тесте, что активные профили ( с использованием
@ActiveProfiles("profile1,profile2")
) вprofile1,profile2
которомprofile2
будет просто переопределить (некоторые, один не нужно переопределить все) свойства отprofile1
.источник
Я попробовал все перечисленные вопросы, но все они не подходят для моей задачи: использование определенного файла yaml для некоторого модульного теста. В моем случае это работает так:
источник
Нет необходимости добавлять как YamlPropertyLoaderFactory или YamlFileApplicationContextInitializer. Вы должны преобразовать свою идею. как обычный весенний проект. Вы знаете, не используя конфигурацию Java. Просто * .xml
Следуй этим шагам:
Просто добавьте applicationContext.xml как
затем добавьте
к вашему
ApplicationMainClass
.Это может помочь сканировать ваш application-test.yml
источник