使用Mockito Mock含链式接口方法的Java类时遇空指针问题求助
解决Mockito链式调用空指针异常的问题
我之前也踩过这个坑!你现在遇到的问题很典型:当你用Mockito.mock(MyProcess.class)创建mock对象时,Mockito默认会让这个mock的所有方法返回null。所以当你调用mock.getProcess()时,返回的是null,再接着调用.getService()自然就抛出空指针异常了。
下面给你两种实用的解决办法,根据你的链式层级复杂度选就行:
方法一:手动逐层Mock并绑定返回关系
这种方式适合层级不多的场景,逻辑清晰,容易调试:
// 先把链式调用里每一层的对象都Mock出来 MyProcess mock = Mockito.mock(MyProcess.class); // 这里替换成getProcess()实际返回的类型 ProcessLayer mockProcessLayer = Mockito.mock(ProcessLayer.class); // 替换成getService()实际返回的类型 Service mockService = Mockito.mock(Service.class); // 绑定链式调用的返回逻辑 Mockito.when(mock.getProcess()).thenReturn(mockProcessLayer); Mockito.when(mockProcessLayer.getService()).thenReturn(mockService); // 现在再执行链式调用就不会NPE了 mock.getProcess() .getService() .startProcessInstanceByKey("String argument");
方法二:用Mockito的深度Mock特性(RETURNS_DEEP_STUBS)
如果你的链式调用层级比较多,手动Mock每一层太繁琐,可以用Mockito的深度Mock特性,一次性搞定多层链式调用的Mock:
// 创建支持深度Mock的对象,指定RETURNS_DEEP_STUBS参数 MyProcess mock = Mockito.mock(MyProcess.class, Mockito.RETURNS_DEEP_STUBS); // 直接给最底层的方法设置返回值(中间层会自动被Mock) Mockito.when(mock.getProcess().getService().startProcessInstanceByKey(Mockito.anyString())) .thenReturn(/* 这里填你需要返回的实例,比如ProcessInstance对象 */); // 链式调用正常执行 mock.getProcess() .getService() .startProcessInstanceByKey("String argument");
⚠️ 注意:用深度Mock时,when()里的链式调用必须写完整,不能拆分步骤,否则可能会出现不符合预期的Mock行为。
如果之后需要验证链式调用中的方法是否被执行,也要对应写完整的调用链,比如:
Mockito.verify(mock.getProcess().getService()).startProcessInstanceByKey("String argument");
内容的提问来源于stack exchange,提问作者Etch
相关产品推荐
相关产品推荐

