Mockito模拟Dio.post报错FakeUsedError:未找到匹配存根
解决Mockito测试中post方法存根参数不匹配的FakeUsedError问题
核心问题
你在给LoginRemoteDataSourceImpl写Mock测试时,给post方法设置的存根参数,和实际调用时传入的参数(包含queryParameters这类带默认值的参数)不匹配。Mockito的参数匹配是严格校验的,只要有一个参数对不上,就找不到对应的存根逻辑,进而触发Fake对象的statusCode访问错误。
具体修复方案
1. 用参数匹配器兼容默认参数
别直接写死参数值,改用Mockito的参数匹配器来匹配任意值或默认值,适配命名参数的情况:
// 假设post方法签名为 post(String url, {Map<String, dynamic>? queryParameters, ...}) when(mockClient.post( any, // 匹配任意url queryParameters: anyNamed('queryParameters'), // 兼容该参数的所有值(包括默认的null/空Map) // 其他命名参数同理,用anyNamed对应参数名 )).thenAnswer((_) async => Response(...));
如果需要部分参数严格匹配、部分兼容默认值,就混合使用:
when(mockClient.post( '/login', // 严格匹配目标url queryParameters: anyNamed('queryParameters'), // 兼容该参数的默认值 headers: eq({'Content-Type': 'application/json'}), // 严格匹配headers参数 )).thenAnswer((_) async => Response(...));
2. 显式传入和实际调用一致的默认值
如果你明确知道post方法的默认参数值(比如queryParameters默认是const {}),存根时直接传入这个值:
when(mockClient.post( '/login', queryParameters: const {}, // 和实际调用的默认值完全一致 // 其他参数也按方法定义的默认值填写 )).thenAnswer((_) async => Response(...));
3. 核对方法签名的默认参数定义
先确认post方法的命名参数默认值:比如如果queryParameters的默认值是null,那存根时就要用null,不能传空Map;反之如果默认是空Map,就对应传入空Map,确保存根和实际调用的参数完全对齐。
调试小技巧
如果不确定实际调用的参数是什么,可以临时在测试中加打印,对比存根参数:
// 临时替换post方法,打印实际调用的参数 mockClient.post = (url, {queryParameters, ...}) { print('实际调用的url: $url,queryParameters: $queryParameters'); return super.post(url, queryParameters: queryParameters, ...); };
内容的提问来源于stack exchange,提问作者Mohammad Mousavi
相关产品推荐
相关产品推荐

