Junit 5 mockito 无法读取 spring 引导应用程序中用 @Value 注释的属性文件

Junit 5 mockito unable to read properties file annotated with @Value in spring boot application

我正在为 spring 启动应用程序中的一个组件编写一个 junit 测试用例。该组件具有 @Value 注释并从 属性 文件中读取值。

当我 运行 我的 Junit 5 (mockito) 并且控件转到组件时;值为空。

我尝试过的: 我用了 @ExtendWith(SpringRunner) 并将 @injectMocks 更改为 @Autowired,将 @mock 更改为 @MockBeans,但这不是我想要的(因为它已成为集成测试。)

单位class:

@ExtendWith(MockitoExtension.class)
public class ItemMessageProcessorTest {

    private static final String VALUE1 = "Value 1";
    private static final String VALUE2 = "Value 2";
    private static final String VALUE3 = "Value 3";

    @InjectMocks
    private MyComponent component;

    

组件class:

@Slf4j
@Component
public class MyComponent {

    @Value("${my-val.second-val.final-val}")
    private String myValue;

这个 myValue 正在同一个组件中使用 class:

 public void myMethod(){
    myObject.setMyValue(Integer.parseInt(myValue));
}

我要找的是这样的东西: 如果我有机会模拟 parseInt,或者从测试 class 本身加载值。任何线索都会有很大的帮助。 注意:我无法更改组件中的任何内容 class。

您可以只使用Spring reflection utills 方法通过@Value 设置字段值进行单元测试:

org.springframework.test.util.ReflectionTestUtils.setField(classUnderTest, "field", "value");

在这种情况下我会进行构造函数注入:

@Slf4j
@Component
public class MyComponent {

    private final String myValue;

    MyComponent(@Value("${my-val.second-val.final-val}" String myValue)) {
        this.myValue = myValue;
    }
}

来自 application.properties 的值被加载到 Spring Application Context 在这些情况下:

  • 申请时 运行,
  • Spring 集成测试 运行时。

如果未加载单元测试属性。

如果您有构造函数注入,您可以为测试设置一个值并将其传递给构造函数。