覆盖 Junit 测试中的默认 Spring-Boot 应用程序属性设置

2022-08-31 05:35:47

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

我想用文件中声明的属性覆盖JUnit测试中的一些默认设置(src/test/resources/test.properties)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 {

}

我最初认为在 TestConfig 类中使用可以解决问题,但这些属性不会覆盖 application.properties 设置(请参阅 Spring-Boot 参考文档 - 23。外部化配置)。@PropertySource("classpath:test.properties")

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

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

  static {
    System.setProperty("spring.config.location", "classpath:test.properties");
  }

}

不幸的是,这又没有成功。

关于如何覆盖JUnit测试中的设置,必须有一个简单的解决方案,我一定忽略了它。application.propertiestest.properties


答案 1

可用于覆盖 中的值。从它的javadoc:@TestPropertySourceapplication.properties

测试属性源可用于有选择地覆盖系统和应用程序属性源中定义的属性

例如:

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

}

答案 2

弹簧启动会自动加载,如果使用以下注释src/test/resources/application.properties

@RunWith(SpringRunner.class)
@SpringBootTest

因此,重命名为以利用自动配置。test.propertiesapplication.properties

如果只需要加载属性文件(到环境中),则还可以使用以下方法,如此所述

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

[更新:覆盖某些属性以进行测试]

  1. 加。src/main/resources/application-test.properties
  2. 用 注释测试类。@ActiveProfiles("test")

这将加载,然后按照此处定义的规则将属性加载到测试用例的应用程序上下文中。application.propertiesapplication-test.properties

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


推荐