Junit 5 mockito 无法读取 spring 引导应用程序中用 @Value 注释的属性文件
Junit 5 mockito unable to read properties file annotated with @Value in spring boot application
我正在为 spring 启动应用程序中的一个组件编写一个 junit 测试用例。该组件具有 @Valu
e 注释并从 属性 文件中读取值。
当我 运行 我的 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 集成测试 运行时。
如果未加载单元测试属性。
如果您有构造函数注入,您可以为测试设置一个值并将其传递给构造函数。
我正在为 spring 启动应用程序中的一个组件编写一个 junit 测试用例。该组件具有 @Valu
e 注释并从 属性 文件中读取值。
当我 运行 我的 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 集成测试 运行时。
如果未加载单元测试属性。
如果您有构造函数注入,您可以为测试设置一个值并将其传递给构造函数。