Mockito模拟含函数与对象参数的callservice方法问题
解决Mockito模拟soapConnector.callservice返回null的问题
你的mock一直返回null,核心原因是参数匹配失败——Mockito默认要求传入的参数和mock时指定的参数完全一致(实例相等),但测试代码和业务代码里的参数根本不是同一个实例,具体问题和解决方法如下:
问题点拆解
- Request实例不匹配:业务代码里的
request是SoapRequests.buildRequest(str1, str2)生成的,而测试里是SoapRequests.buildRequest("", "", "")生成的requestSpy,两个实例完全独立,Mockito无法识别为同一参数。 - Consumer实例不匹配:业务代码里的
exception和fault是方法内部创建的匿名Consumer实例,测试里mock的faultType、exception是全新的mock实例,两者无任何关联,匹配必然失败。
解决方案:使用Mockito参数匹配器放宽匹配条件
既然无法让测试和业务里的参数实例完全一致,直接用Mockito的参数匹配器匹配任意符合类型的参数即可:
// 先导入Mockito静态匹配器 import static org.mockito.ArgumentMatchers.*; // 构建预期返回的response JAXBElement<?> response = jaxbUnmarshaller.unmarshal("xmlString", SomeClass12.class); // 改写mock逻辑,用匹配器替代具体实例 when(soapConnector.callservice( eq("target"), // target字符串精确匹配 any(JAXBElement.class), // 匹配任意JAXBElement类型的request any(Consumer.class), // 匹配任意FaultType类型的Consumer any(Consumer.class), // 匹配任意Exception类型的Consumer eq(false) // 最后一个布尔值精确匹配 )).thenReturn(response);
额外提示
- 如果
SoapRequests.buildRequest是静态方法且需要精确控制返回的request实例,可以结合PowerMock mock静态方法,但一般优先用参数匹配器更简洁。 - 检查业务代码里的
callservice调用参数:你写的代码里调用时传的是ex,但前面定义的变量是exception,这大概率是笔误,建议修正避免实际运行时出现空指针。
内容的提问来源于stack exchange,提问作者AktionScript
相关产品推荐
相关产品推荐

