Переопределить настройки по умолчанию Spring -Boot application.properties в тесте Junit
У меня есть приложение Spring -Boot, где свойства по умолчанию задаются в файле application.properties
в пути к классам (src/main/resources/application.properties).
Я хотел бы переопределить некоторые настройки по умолчанию в своем тесте JUnit со свойствами, объявленными в файле test.properties
(src/test/resources/test.properties)
Обычно у меня есть специальный класс конфигурации для моих тестов 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 Reference Doc - 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
, которые я должен упустить.
Ответы
Ответ 1
Вы можете использовать @TestPropertySource
для переопределения значений в application.properties
. Из своего javadoc:
Источники свойств test могут использоваться для выборочного переопределения свойств, определенных в источниках свойств системы и приложений
Например:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {
}
Ответ 2
Вы также можете использовать метааннотации для вывода конфигурации. Например:
@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests {
...
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }
Ответ 3
Spring Boot автоматически загружает src/test/resources/application.properties
, если используются следующие аннотации
@RunWith(SpringRunner.class)
@SpringBootTest
Итак, переименуйте test.properties
в application.properties
чтобы использовать автоматическую настройку.
Если вам * нужно * загрузить файл свойств (в среду), вы также можете использовать следующее, как описано здесь
@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
[Обновление: переопределение определенных свойств для тестирования]
- Добавьте
src/main/resources/application-test.properties
. - Аннотируйте тестовый класс с помощью
@ActiveProfiles("test")
.
Это загружает application.properties
, а затем application-test.properties
свойства в контексте приложения для теста, в соответствии с правилами, определенными здесь.
Демонстрация - https://github.com/mohnish82/so-spring-boot-testprops
Ответ 4
TL;DR:
Поэтому у меня были стандартные src/main/resources/application.properties
а также src/test/resources/application-default.properties
где я переопределяю некоторые настройки для ВСЕХ моих тестов.
Вся история
Я столкнулся с той же проблемой и до сих пор не использовал профили. Казалось, надоело делать это сейчас и помнить объявление профиля - о котором легко забыть.
Хитрость заключается в том, чтобы использовать тот профиль application-<profile>.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.
Ответ 5
В противном случае мы можем изменить имя конфигуратора свойств по умолчанию, установив свойство spring.config.name=test
, а затем получив ресурс класса
src/test/test.properties
наш собственный экземпляр org.springframework.boot.SpringApplication
будет автоматически сконфигурирован из этого разделенного test.properties, игнорируя свойства приложения;
Преимущества: автоматическая настройка тестов;
Недостаток: отображение свойства spring.config.name "на C.I. Слой
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
spring.config.name = application # Имя файла конфигурации
Ответ 6
Вы также можете создать файл application.properties в src/test/resources, где написаны ваши JUnits.
Ответ 7
Другой подход, подходящий для переопределения нескольких свойств в вашем тесте, если вы используете аннотацию @SpringBootTest
:
@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})