如何验证带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
相关产品推荐
相关产品推荐

