使用Mocktail测试模拟HTTP客户端时出现Null不是Future<Response>子类型错误
错误成因
该报错是因为Mocktail未命中你预设的方法调用桩规则,默认返回Null,而http.Client.get方法的返回值为非空的Future<Response>类型,类型不匹配触发了类型错误。
具体规则未命中的原因:
- 测试代码
when中预设的get方法入参url为Uri.parse('https://api.test.com/') - 业务代码
getId方法实际调用client.get时,传入的url为拼接了路径和参数的Uri.parse('https://api.test.com/query?username=$username'),和预设值完全不一致,桩规则匹配失败。
解决方法
方案1:精确匹配url(推荐,可同时校验url生成逻辑是否正确)
将测试中预设的url替换为业务代码实际生成的对应值即可:
// 替换原来的url定义 final url = Uri.parse('https://api.test.com/query?username=$tUsername'); // 桩代码保持不变 when(() => mockHttpClient.get(url)) .thenAnswer((_) async => http.Response( fixture('account.json'), 200, ));
方案2:模糊匹配(无需校验url的场景使用)
如果你的测试不需要验证调用的url是否正确,可以用Mocktail提供的any()匹配符匹配任意入参:
// 导入mocktail(如果没有导入的话) import 'package:mocktail/mocktail.dart'; // 匹配任意Uri类型的入参 when(() => mockHttpClient.get(any<Uri>())) .thenAnswer((_) async => http.Response( fixture('account.json'), 200, ));
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

