JUnit5配合Mockito测试Spring Boot组件@Value注入属性为null怎么解决
解决方案
方案1:使用反射为私有@Value字段注入测试值
该方案无需修改业务代码,也不会启动Spring上下文,属于纯单元测试范畴,是更推荐的实现方式。你可以直接使用Spring Test提供的ReflectionTestUtils工具类完成私有字段赋值:
@ExtendWith(MockitoExtension.class) public class ItemMessageProcessorTest { // 按需配置测试用的属性值 private static final String TEST_MY_VALUE = "123"; 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; @BeforeEach void setUp() { // 直接为MyComponent的私有字段myValue注入测试值 ReflectionTestUtils.setField(component, "myValue", TEST_MY_VALUE); } @Test void testMyMethod() { // 你的测试逻辑 component.myMethod(); // 你的断言逻辑 } }
如果项目中没有引入Spring Test依赖,也可以用JDK原生反射API实现同样的效果,无需额外引入依赖。
方案2:Mock静态方法Integer.parseInt
如果你不想给属性字段赋值,只想Mock解析逻辑,可使用Mockito 3.4及以上版本支持的静态方法Mock能力实现:
@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"; // 配置parseInt要返回的模拟值 private static final Integer EXPECTED_INT = 123; @InjectMocks private MyComponent component; @Test void testMyMethod() { try (MockedStatic<Integer> mockedInteger = Mockito.mockStatic(Integer.class)) { // 配置静态方法的返回规则 mockedInteger.when(() -> Integer.parseInt(anyString())).thenReturn(EXPECTED_INT); // 执行测试方法 component.myMethod(); // 验证静态方法调用次数 mockedInteger.verify(() -> Integer.parseInt(anyString()), times(1)); // 其余断言逻辑 } } }
注意事项:
- 静态方法Mock需要引入
mockito-inline依赖替换默认的mockito-core才能支持 - 静态方法Mock的性能和可维护性不如方案1,非特殊场景优先选择方案1
内容的提问来源于stack exchange,提问作者DeskToDevelop
相关产品推荐
相关产品推荐

