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

如何验证带ChangeCardStatusRequest参数的Mock方法调用?

解决Mockito验证自定义类参数不匹配的问题

问题核心:Mockito默认通过引用相等判断方法参数是否匹配。你在Stub和Verify时分别创建了ChangeCardStatusRequest实例,这两个是不同对象,因此验证失败。

以下是三种可行的解决方法:

方法1:重写自定义类的==和hashCode

让ChangeCardStatusRequest根据属性值判断相等性,而非引用。修改实体类:

class ChangeCardStatusRequest {
  final String status;

  ChangeCardStatusRequest({required this.status});

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is ChangeCardStatusRequest &&
          runtimeType == other.runtimeType &&
          status == other.status;

  @override
  int get hashCode => status.hashCode;
}

修改后,你原来的Verify代码可以直接正常运行,因为Mockito会基于属性值匹配参数。

方法2:使用Mockito的argThat匹配器

无需修改实体类,通过argThat自定义参数匹配规则,检查参数的属性是否符合预期:

verify(appApiService.changeCardStatus(
  cardId,
  argThat(predicate((ChangeCardStatusRequest req) => 
    req.status == CARD_STATUS_ELIGIBLE
  )),
));

如果需要更清晰的错误提示,可以给匹配器添加名称和描述:

verify(appApiService.changeCardStatus(
  cardId,
  argThat(
    predicate((req) => req.status == CARD_STATUS_ELIGIBLE),
    named: 'changeCardStatusRequest',
    description: 'status should be CARD_STATUS_ELIGIBLE'
  ),
));

方法3:复用同一个参数实例(局限性较大)

提前创建好请求实例,在Stub和仓库调用逻辑中复用(需调整测试或代码结构):

// 测试前创建实例
final testRequest = ChangeCardStatusRequest(status: CARD_STATUS_ELIGIBLE);

// Stub时使用该实例
when(appApiService.changeCardStatus(cardId, testRequest))
  .thenAnswer((_) async => HttpResponse(...));

// 若要让仓库方法使用该实例,需调整仓库实现(比如注入请求创建逻辑)
// 此方法仅适合简单测试场景,灵活性较低

推荐方案

  • 若该类在多个测试中都会用到,优先选方法1,一劳永逸解决所有匹配问题。
  • 若不想修改实体类,或仅在单个测试中需要匹配,选方法2更灵活。

内容的提问来源于stack exchange,提问作者Root Root

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:35:51