У меня есть приложение Spring-Boot, где свойства по умолчанию установлены в application.properties
файле в classpath (src / main / resources / application.properties).
Я хотел бы переопределить некоторые настройки по умолчанию в моем тесте JUnit свойствами, объявленными в test.properties
файле (src / test / resources / test.properties)
У меня обычно есть специальный класс Config для моих тестов Junit, например
package foo.bar.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
}
Сначала я подумал, что использование @PropertySource("classpath:test.properties")
в классе TestConfig поможет, но эти свойства не будут перезаписывать настройки application.properties (см. Справочный документ Spring-Boot - 23. Внешняя конфигурация ).
Затем я попытался использовать -Dspring.config.location=classpath:test.properties
при вызове теста. Это было успешно - но я не хочу устанавливать это системное свойство для каждого выполнения теста. Таким образом я положил это в коде
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
что, к сожалению, снова не удалось.
Должно быть простое решение о том, как переопределить application.properties
настройки в тестах JUnit, test.properties
которые я должен был пропустить.
источник
Ответы:
Вы можете использовать
@TestPropertySource
для переопределения значений вapplication.properties
. Из своего javadoc:Например:
источник
@TestPropertySource
может приниматьproperties
аргумент для перезаписи некоторого встроенного свойства, например@TestPropertySource(properties = "myConf.myProp=valueInTest")
, это полезно, если вам не нужен совершенно новый файл свойств.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
это уже устарело, и вы должны использовать@SpringBootTest
Spring Boot автоматически загружается
src/test/resources/application.properties
, если используются следующие аннотацииТаким образом, переименование
test.properties
доapplication.properties
использовать автоматическую конфигурацию.[ Обновление: переопределение определенных свойств для тестирования ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Это загружает
application.properties
и затемapplication-test.properties
свойства в контекст приложения для контрольного примера, согласно правилам, определенным здесь .Демонстрация - https://github.com/mohnish82/so-spring-boot-testprops
источник
application.properties
файла в пути к классам (один входsrc/main/resources
и один входsrc/test/resources
). Кто гарантирует, что оба будут взяты, и какой будет взят первым?application-test.properties
вsrc/main/resources
и указать вtest
качестве активного профиля в тесте.src/test/resources/application.properties
загружаются во время фазы тестирования,src/main/resources/application.properties
игнорируется.application-default.properties
и они будут учтены, потому что вы автоматически запускаете профиль «по умолчанию» (если не объявлен другой).Вы также можете использовать метааннотации для вывода конфигурации. Например:
источник
Другой подход, подходящий для переопределения нескольких свойств в вашем тесте, если вы используете
@SpringBootTest
аннотацию:источник
SpringBootTest
загрузить файл application.properties?TLDR:
Так что я сделал, чтобы был стандарт,
src/main/resources/application.properties
а такжеsrc/test/resources/application-default.properties
где я переопределил некоторые настройки для всех моих тестов.Вся история
Я столкнулся с той же проблемой и до сих пор не использовал профили. Казалось, надоело делать это сейчас и помнить объявление профиля - который можно легко забыть.
Хитрость заключается в том, чтобы использовать, что определенный профиль
application-<profile>.properties
переопределяет настройки в общем профиле. См. Https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .источник
Простое объяснение:
Если вы похожи на меня , и у вас есть то же самое
application.properties
вsrc/main/resources
иsrc/test/resources
, и вы интересно , почемуapplication.properties
в вашей папке тестов не перекрываяapplication.properties
в основных ресурсах, читайте дальше ...Если у вас есть
application.properties
подsrc/main/resources
и то же самоеapplication.properties
подsrc/test/resources
, котороеapplication.properties
подбирается, зависит от того, как вы выполняете свои тесты . Папка структураsrc/main/resources
иsrc/test/resources
является Maven архитектурного соглашением, так что если вы запускаете тест , какmvnw test
или дажеgradlew test
, тоapplication.properties
вsrc/test/resources
будет получить взяли, так как тест путь к классам будут предшествовать основной путь к классам. Но, если вы запускаете тест , какRun as JUnit Test
в ELIPSE / STS, тоapplication.properties
вsrc/main/resources
будет получить взял, как и основные пути к классам предшествуют тест классы.Вы можете проверить это, открыв
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Вы увидите что-то вроде:
Вы видите, что сначала идет \ main , а затем \ test ? Да, это все о classpath :-)
ура
источник
источник
Если вы используете Spring 5.2.5 и Spring Boot 2.2.6 и хотите переопределить только несколько свойств вместо всего файла. Вы можете использовать новую аннотацию: @DynamicPropertySource
источник
В противном случае мы можем изменить имя конфигуратора свойств по умолчанию, задав свойство
spring.config.name=test
и затем имея ресурс пути к классу,src/test/test.properties
наш собственный экземпляр которогоorg.springframework.boot.SpringApplication
будет автоматически конфигурироваться из этого разделенного test.properties, игнорируя свойства приложения;Преимущество: автоконфигурация тестов;
Недостаток: экспонирование свойства "spring.config.name" на уровне CI
ссылка: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
источник
application.properties
- не вариант для меня, поскольку я хочу переопределить только некоторые исходные значения конфигурации в тесте.Вы также можете создать файл application.properties в src / test / resources, где написаны ваши JUnits.
источник