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

Flutter中Mock Dio做接口测试报Null不属于BaseOptions类型如何解决

错误原因
  • 你用Mockito生成的DioMock默认所有属性返回值都是null,当NetworkService构造函数中访问dio.options时拿到的是null,不符合BaseOptions类型要求,直接触发报错。
  • 初始化顺序错误:你先实例化NetworkService,之后才配置dio.options,但构造函数执行时就已经访问了dio.options,配置操作完全没生效。
  • 后续还有请求参数匹配、返回数据结构、断言类型的错误也会导致测试不通过。
修复步骤
  1. 提前Stub Dio的必填属性:先创建真实的BaseOptions和InterceptorList实例,在实例化NetworkService之前就配置Mock的返回值。
  2. 调整初始化顺序:先完成所有Dio的Stub配置,再初始化NetworkService。
  3. 修正请求匹配规则:匹配getRecipe方法中实际传入的请求路径。
  4. 修正返回数据结构和断言类型:返回符合接口结构的模拟数据,断言类型和实际返回值匹配。
修正后的测试代码
class DioMock extends Mock implements DioForNative {}

main() {
  final dio = DioMock();
  // 提前stub options属性,返回真实的BaseOptions实例
  final mockOptions = BaseOptions();
  when(dio.options).thenReturn(mockOptions);
  // stub interceptors属性,返回真实的拦截器列表实例
  when(dio.interceptors).thenReturn(InterceptorList());

  // 完成所有stub后再初始化NetworkService
  final service = NetworkService(dio);

  test("should return list of Recipe", () async {
    // 构造符合接口返回格式的模拟数据
    final mockResponseData = {
      'results': [
        {'title': '测试菜谱', 'id': 1}
      ]
    };
    final response = Response(
      requestOptions: RequestOptions(path: '/?page=1&query=beef'),
      data: mockResponseData,
      statusCode: 200,
    );
    // 匹配实际调用的get方法参数
    when(dio.get('/?page=1&query=beef'))
        .thenAnswer((_) async => response);

    final result = await service.getRecipe();
    // 断言类型和返回值匹配,getRecipe返回的是List<Recipe>
    expect(result, isA<List<Recipe>>());
    expect(result.length, 1);
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:03