You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito模拟含函数与对象参数的callservice方法问题

解决Mockito模拟soapConnector.callservice返回null的问题

你的mock一直返回null,核心原因是参数匹配失败——Mockito默认要求传入的参数和mock时指定的参数完全一致(实例相等),但测试代码和业务代码里的参数根本不是同一个实例,具体问题和解决方法如下:

问题点拆解

  1. Request实例不匹配:业务代码里的request是SoapRequests.buildRequest(str1, str2)生成的,而测试里是SoapRequests.buildRequest("", "", "")生成的requestSpy,两个实例完全独立,Mockito无法识别为同一参数。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:07:32