提问者:小点点

方便且临时地修改应用程序属性文件中的 Spring 属性


有时,我们希望在运行单元测试或应用程序时覆盖 Spring application.properties 文件中的属性。

假设gradle管理构建,并在MinimalValueTest.java中考虑这个测试模块。

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ActiveProfiles;

@SpringBootTest
@ActiveProfiles("test")
public class MinimalValueTest {

    @Value("${test.property}")
    String testProperty;

    @Test
    public void test() {
      Assertions.assertTrue(testProperty != null);
      // Support a test that changes the value of test.property at the command line to "property_set_by_override_at_the_command_line"
      // (Unfortunately, org.junit.jupiter version 5 doesn't support this directly.)
      Boolean oneOfTheExpectedValues = (testProperty.equals("a_test_property") ||
                                        testProperty.equals("property_set_by_override_at_the_command_line"));
      Assertions.assertTrue(oneOfTheExpectedValues);
    }

}

此测试引用在< code > src/test/resources/application . properties 文件中定义的此属性:

test.property=a_test_property

什么gradle命令可以用来覆盖test.property的值?

一些现有的SO问题试图解决这个问题,但失败了:覆盖Junit测试中的默认Spring-Boot application . properties设置,通过Gradle运行Java类时传递系统属性和参数的问题,以及将系统属性从Gradle传递到Spring Boot的问题。


共2个答案

匿名用户

环境变量将覆盖应用程序*中定义的任何属性。[属性|yml]。您可以在Spring Boot核心特性文档的外部化配置一节中阅读属性解析顺序。

用环境变量覆盖属性非常简单;你只需要遵循惯例。

    < li >替换点(。)加下划线(_)。 < li >删除任何破折号(-)。 < li >转换为大写。

要在 mac/linux/unix 上覆盖该特定环境变量,请将其导出(遵循上述约定)。

export TEST_PROPERTY=a_test_property

当测试运行时,这将是属性解析器将公开的属性。

匿名用户

在测试上使用< code > @ active profiles(" test ")来启用“测试”配置文件。然后,可以在< code > application–test . properties 中设置该属性。