如何在没有构建 spring 上下文的情况下在 JUnit 5 测试中填充 yml 属性 文件

How to populate yml property file in JUnit 5 test without build spring context

假设我有一项服务从 application.yml 文件中获取了一个 属性 文件:

orders:
  batch-size: 2

并通过@Value注解读取:

@Value("${orders.batch-size}")
private String ordersBatchSize;

进行数据分区。

我正在编写 JUnit 测试,并希望从资源中的 application.yml 文件中获取上述 属性。问题是 JUnit 测试 属性 始终为空。我的 JUnit class 测试用 @ExtendWith(MockitoExtension.class) 注释。 我不想通过用 @SpringBootTest 注释 class 来构建 Spring 上下文。 根据 ,我需要填充 属性 文件,但我可能尝试了所有方法但没有得到理想的结果。

目前尝试次数:

ReflectionTestUtils.setField(classUnderTest, "field", "value")

Yaml yaml = new Yaml();
InputStream inputStream =this.getClass().getClassLoader().getResourceAsStream("application.yml");
yaml.load(inputStream);

Properties properties = new Properties();
properties.load(new FileReader("/application.properties"));

System.setProperty("orders.batch-size", "2");

或:

public static Properties fetchProperties() {
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.yml");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
          // exception logic
        }
    return properties;
}

或来自 主题的提示,但没有带来理想的解决方案。

如果您能提供有关如何解决此问题的建议,我将不胜感激。干杯!

首先,类型应该是整数。

@Value("${orders.batch-size}")
private Integer ordersBatchSize;

然后使用反射实用程序是一种很常见的方法。请注意字段名称必须匹配。

ReflectionTestUtils.setField(classUnderTest, "ordersBatchSize", 100)

更好的方法是在用 @BeforeEach 注释的方法中使用 setter(如果可用)。

@BeforeEach
public void beforeEach() {
    classUnderTest.setOrdersBatchSize(100);
}

最后,最好的方法是在test/resources文件夹中定义application.yml,Spring Boot优先进行测试:

orders.batch-size=100