Переопределить настройки по умолчанию 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) 

[Обновление: переопределение определенных свойств для тестирования]

  1. Добавьте src/main/resources/application-test.properties.
  2. Аннотируйте тестовый класс с помощью @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"})