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

Flutter测试报错“No method stub was called”问题求助

排查Flutter测试中Mockito的"No method stub was called"错误

错误原因

  1. 你手写的MockApiService是普通的接口实现类,调用它的fetchData()方法时会直接执行你写的真实逻辑,Mockito没法拦截这个调用,所以when()方法里识别不到需要打桩的mock方法,直接抛出错误。
  2. 测试逻辑存在漏洞:你在还没调用fetchData()的情况下就执行verify验证,这本身也会导致验证失败,因为目标方法根本没被触发过。

解决步骤

  1. 改用Mockito自动生成的Mock类
    不要自己手写Mock实现,而是用Mockito的代码生成功能创建符合要求的Mock类。首先确保你的pubspec.yaml里添加了必要的开发依赖:

    dev_dependencies:
      flutter_test:
        sdk: flutter
      mockito: ^5.4.0
      build_runner: ^2.4.4
    
  2. 生成Mock类并调整测试代码
    用Mock类继承+implements目标接口的方式定义Mock类,然后用Mockito的API打桩和验证:

    import 'package:http/http.dart' as http;
    import 'package:mockito/mockito.dart';
    import 'package:test/test.dart';
    
    // 基于HttpService生成Mockito兼容的Mock类
    class MockHttpService extends Mock implements HttpService {}
    
    abstract class HttpService {
      Future<http.Response> fetchData();
    }
    
    Future<http.Response> helperFunc() async {
      return http.Response('Mocked Response', 200);
    }
    
    void main() {
      group('API Tests', () {
        test('Mock API Request', () async {
          // 初始化Mockito生成的Mock对象
          final mockApiService = MockHttpService();
    
          // 为Mock方法配置返回逻辑(打桩)
          when(mockApiService.fetchData())
              .thenAnswer((_) async => helperFunc());
    
          // 必须先调用目标方法,才能验证调用行为
          await mockApiService.fetchData();
    
          // 验证fetchData方法是否被调用了1次
          verify(mockApiService.fetchData()).called(1);
        });
      });
    }
    
  3. 生成Mock类文件
    在终端执行以下命令,让build_runner生成对应的Mock类代码:

    flutter pub run build_runner build
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:37:21