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); - 如果是方法,确保调用时带括号,模拟语法正确。
- 如果是Getter(无括号),模拟时要去掉括号:
更新依赖并重新生成Mock类
- 执行
flutter pub upgrade确保mockito、build_runner与flutter_test版本兼容 - 运行
flutter pub run build_runner build重新生成Mock类,避免使用旧的或未正确生成的类
- 执行
内容的提问来源于stack exchange,提问作者KingNeo
相关产品推荐
相关产品推荐

