首页 文章

覆盖Junit Test中的默认Spring-Boot application.properties设置

提问于
浏览
113

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

我想在我的JUnit测试中覆盖一些默认设置,其中包含在 test.properties 文件中声明的属性(src / test / resources / test.properties)

我通常会为我的Junit测试提供专用的Config类,例如:

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参考文档 - 23. Externalized Configuration) .

然后我在调用测试时尝试使用 -Dspring.config.location=classpath:test.properties . 这很成功 - 但我不想为每次测试执行设置此系统属性 . 因此我把它放在代码中

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

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

}

不幸的是,再次没有成功 .

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

6 回答

  • 200

    您还可以在编写JUnit的src / test / resources中创建application.properties文件 .

  • 48

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

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

    例如:

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

    您还可以使用meta-annotations外部化配置 . 例如:

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

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

    @RunWith(SpringRunner.class)
    @SpringBootTest
    

    因此,将 test.properties 重命名为 application.properties 以使用自动配置 .

    如果* *只需要加载属性文件(进入环境),你也可以使用以下内容,如@RunWith(SpringRunner.class)所述
    @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)

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

    • 添加 src/main/resources/application-test.properties .

    • 使用 @ActiveProfiles("test") 注释测试类 .

    根据定义的规则here,这会将 application.propertiesapplication-test.properties 属性加载到测试用例的应用程序上下文中 .

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

  • 0

    否则,我们可能会更改默认属性配置程序名称,设置属性 spring.config.name=test 然后具有类路径资源 src/test/test.properties 我们的 org.springframework.boot.SpringApplication 本机实例将从此分离的test.properties中自动配置,忽略应用程序属性;

    好处:自动配置测试;

    缺点:在C.I.公开“spring.config.name”属性 . 层

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

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

  • 0

    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

相关问题