有时,我们希望在运行单元测试或应用程序时覆盖 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的问题。
环境变量将覆盖应用程序*中定义的任何属性。[属性|yml]。您可以在Spring Boot核心特性文档的外部化配置一节中阅读属性解析顺序。
用环境变量覆盖属性非常简单;你只需要遵循惯例。
要在 mac/linux/unix 上覆盖该特定环境变量,请将其导出(遵循上述约定)。
export TEST_PROPERTY=a_test_property
当测试运行时,这将是属性解析器将公开的属性。
在测试上使用< code > @ active profiles(" test ")来启用“测试”配置文件。然后,可以在< code > application–test . properties 中设置该属性。