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

Flutter Widget测试Mockito报错:Null不是bool的子类型求助

Flutter Widget测试Mockito报错:'type Null is not a subtype of bool'

问题场景

使用Flutter Test编写Widget测试时,通过Mockito模拟GlobalSearchViewModel,在执行when(mockGlobalSearchViewModel.isNetworkError()).thenReturn(true)时抛出'type Null is not a subtype of bool'错误,相关代码如下:

class MockGlobalSearchViewModel extends Mock implements GlobalSearchViewModel {}

@GenerateMocks([MockGlobalSearchViewModel])

testWidgets('Global Widget Test', (WidgetTester tester) async {
    // Create mock instances
    final mockGlobalSearchViewModel = MockGlobalSearchViewModel();
   
    when(mockGlobalSearchViewModel.isNetworkError()).thenReturn(true);//错误发生在这里
        
    final globalSearchViewModelProvider = Provider<GlobalSearchViewModel>.value(value: mockGlobalSearchViewModel);

 await tester.pumpWidget(
      MaterialApp(
        home: MultiProvider(
          providers: [
            globalSearchViewModelProvider,
         
          ],
          child: const GlobalSearchWidget()

排查与修复方案

  • 修正Mockito注解使用方式
    错误地对自定义的MockGlobalSearchViewModel类使用了@GenerateMocks注解,正确做法是直接对原始的GlobalSearchViewModel生成Mock类,无需手动定义Mock类。调整后代码:

    // 移除手动定义的MockGlobalSearchViewModel
    @GenerateMocks([GlobalSearchViewModel])
    
    testWidgets('Global Widget Test', (WidgetTester tester) async {
        final mockGlobalSearchViewModel = MockGlobalSearchViewModel(); // 由注解自动生成的类
       
        when(mockGlobalSearchViewModel.isNetworkError()).thenReturn(true);
        
        // 后续Provider和pumpWidget代码保持不变
    });
    
  • 区分方法与Getter的模拟语法
    检查GlobalSearchViewModel中isNetworkError是方法还是Getter:

    • 如果是Getter(无括号),模拟时要去掉括号:
      when(mockGlobalSearchViewModel.isNetworkError).thenReturn(true);
      
    • 如果是方法,确保调用时带括号,模拟语法正确。
  • 更新依赖并重新生成Mock类

    1. 执行flutter pub upgrade确保mockito、build_runner与flutter_test版本兼容
    2. 运行flutter pub run build_runner build重新生成Mock类,避免使用旧的或未正确生成的类

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:42:17