Переопределить приложение Spring-Boot по умолчанию.настройки свойств в тесте Junit



у меня есть приложение Spring-Boot, где свойства по умолчанию установлены в application.properties файл в пути к классам (src / main/resources / application.свойства.)



Я хотел бы переопределить некоторые настройки по умолчанию в моем тесте JUnit со свойствами, объявленными в test.properties file (src/test/resources/test.свойства)



у меня обычно есть специальный класс конфигурации для моих тестов 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 сделал бы трюк, но эти свойства не будут перезаписывать приложение.настройки свойств (см. 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 что я, должно быть, проглядели.

735   5  

5 ответов:

можно использовать @TestPropertySource для переопределения значений в application.properties. Из его javadoc:

источники тестовых свойств можно использовать для выборочного переопределения свойств, определенных в источниках системных и прикладных свойств

например:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}

вы также можете использовать мета-аннотации копирование конфигурации. Например:

@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 { }

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 свойства в контекст приложения для тестового случая, согласно правилам, определенным здесь.

Demo -https://github.com/mohnish82/so-spring-boot-testprops

В противном случае мы можем изменить имя конфигуратора свойств по умолчанию, установив свойство spring.config.name=test а затем имея ресурс пути к классу src/test/test.properties наш родной экземпляр org.springframework.boot.SpringApplication будет автоматически настроен из этого отдельного теста.свойства, игнорируя свойства приложения;

преимущество: автоматическая настройка тестов;

недостаток: разоблачение "spring.config.name" собственность в C. I. layer

ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config. name=application # Config file name

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

Comments

    Ничего не найдено.