在Junittesting中覆盖默认的Spring-Boot application.properties设置

我有一个Spring-Boot应用application.properties ,在classpath(src / main / resources / application.properties)的application.properties文件中设置默认属性。

我想重写我的JUnittesting中的一些默认设置,在test.properties文件中声明的属性(src / test / resources / test.properties)

我通常有一个专门的configuration类为我的Junittesting,例如

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

我首先想到在TestConfig类中使用@PropertySource("classpath:test.properties")可以做到这一点,但是这些属性不会覆盖application.properties设置(请参阅Spring-Boot Reference Doc – 23. Externalized Configuration )。

然后,我试图在调用testing时使用-Dspring.config.location=classpath:test.properties 。 这是成功的 – 但我不想为每个testing执行设置此系统属性。 因此,我把它放在代码中

 @Configuration @Import(CoreConfig.class) @EnableAutoConfiguration public class TestConfig { static { System.setProperty("spring.config.location", "classpath:test.properties"); } } 

不幸的是再次不成功。

必须有一个简单的解决scheme,如何覆盖JUnittesting中的application.properties设置,我必须忽略test.properties

您可以使用@TestPropertySource覆盖application.properties值。 从它的javadoc:

testing属性源可用于select性地覆盖在系统和应用程序属性源中定义的属性

例如:

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

您也可以使用元注释来外化configuration。 例如:

 @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以使用自动configuration。

如果你只*需要加载属性文件(进入环境),也可以使用下面的内容,如这里所解释的

 @RunWith(SpringRunner.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[ 更新:覆盖某些属性进行testing ]

  1. 添加src/main/resources/application-test.properties
  2. @ActiveProfile("test")注释testing类。

这将根据此处定义的规则将application.propertiesapplication-test.properties属性加载到testing用例的应用程序上下文中。

演示 – https://github.com/mohnish82/so​​-spring-boot-testprops

否则,我们可能会更改默认的属性configuration器名称,设置属性spring.config.name=test ,然后使用类path资源src/test/test.properties我们的org.springframework.boot.SpringApplication的本地实例将被自动configuration从这个分离的test.properties中,忽略应用程序属性;

好处:自动configurationtesting;

缺点:在CI层暴露“spring.config.name”属性

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

spring.config.name = application#configuration文件名