在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 ]
- 添加
src/main/resources/application-test.properties
。 - 用
@ActiveProfile("test")
注释testing类。
这将根据此处定义的规则将application.properties
和application-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文件名