Mockito单元测试空指针异常:MyClass方法测试失败求助
问题解决:单元测试NullPointerException修复
你的测试抛出空指针异常的核心原因是:直接调用了MyClass的真实otherMethod方法,而该方法缺少正确的Mock依赖支持,返回了null,后续调用getOSRevision()自然触发空指针。另外你的测试代码还存在语法错误和参数不匹配问题,下面给出两种修复方案:
方案一:完善依赖链Mock(推荐,贴近真实调用逻辑)
这种方案会完整模拟otherMethod内部的调用流程,让真实的otherMethod能返回Mock的OtherMethod对象:
修改后的测试代码:
public class MyClassTest { @Mock private MyClient myClient; @Mock private MyMethodRevisionCall myMethodRevisionCall; @Mock private OtherMethod otherMethod; private MyClass myClass; @BeforeEach void setUp() { MockitoAnnotations.initMocks(this); when(myClient.newMyMethodRevisionCall()).thenReturn(myMethodRevisionCall); // 模拟call方法返回mock的OtherMethod对象 when(myMethodRevisionCall.call(any(someObject.class))).thenReturn(otherMethod); // 模拟getOSRevision的返回值 when(otherMethod.getOSRevision()).thenReturn("TestString"); myClass = new MyClass(myClient); } @Test public void test_myMethod() { // 调用被测试方法,保持参数与mock逻辑一致 final String result = myClass.myMethod("hostName"); // 验证结果符合预期 assertEquals("TestString", result); // 验证call方法被调用1次 verify(myMethodRevisionCall, times(1)).call(any(someObject.class)); } }
方案二:直接Mock MyClass的otherMethod方法
如果不想模拟内部调用链,也可以直接MockotherMethod的返回值,需要用@Spy注解包装MyClass对象:
public class MyClassTest { @Mock private MyClient myClient; @Mock private OtherMethod otherMethod; // 使用Spy包装真实的MyClass对象 @Spy private MyClass myClass; @BeforeEach void setUp() { MockitoAnnotations.initMocks(this); // 注入myClient依赖 myClass = new MyClass(myClient); // 模拟otherMethod返回mock的OtherMethod对象 doReturn(otherMethod).when(myClass).otherMethod("hostName"); // 模拟getOSRevision的返回值 when(otherMethod.getOSRevision()).thenReturn("TestString"); } @Test public void test_myMethod() { final String result = myClass.myMethod("hostName"); assertEquals("TestString", result); verify(myClass, times(1)).otherMethod("hostName"); } }
关键细节提示
- 原测试中
myClass.myMethod("TestString")的参数与Mock逻辑中的"hostName"不匹配,会导致Mock失效,需保持参数一致。 - 原测试的
verify语句存在括号未闭合的语法错误,修复时需补全调用方法。
内容的提问来源于stack exchange,提问作者dredbound
相关产品推荐
相关产品推荐

