如何修复Mockito单元测试中的‘Null类型不是int子类型’错误?
修复Mockito单元测试中的‘Null类型不是int子类型’错误
错误原因分析
报错type 'Null' is not a subtype of type 'int'的核心原因是:MockCalculator的add方法未被正确Stub(预设返回值),调用时返回默认的null,但方法声明返回int类型,触发类型转换错误。结合你的代码,还有两个具体问题:
- 测试文件导入路径错误,未正确引入原始
Calculator类 MockCalculator类的定义或生成不规范,导致Stub逻辑未生效
修复步骤
1. 修正导入路径
打开test/calculator_mock_test.dart,把错误的导入:
import 'calculator_test.dart';
替换为指向lib目录下的原始Calculator类:
import '../lib/calculator.dart';
2. 正确定义MockCalculator类
你有两种方式创建合法的MockCalculator:
方式一:手动定义Mock类(快速简单)
直接在测试文件中添加MockCalculator的定义,继承Mock并实现Calculator接口:
import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import '../lib/calculator.dart'; // 手动定义Mock类 class MockCalculator extends Mock implements Calculator {} void main() { group('Calculator', () { test('addition', () { final mockCalculator = MockCalculator(); // 预设add方法的行为 when(mockCalculator.add(2, 3)).thenReturn(5); final result = mockCalculator.add(2, 3); verify(mockCalculator.add(2, 3)); expect(result, 5); }); }); }
方式二:使用Mockito代码生成(规范推荐,适合复杂类)
如果后续需要扩展更多Mock方法,推荐用代码生成工具:
- 在
pubspec.yaml的dev_dependencies中添加依赖:
dev_dependencies: flutter_test: sdk: flutter mockito: ^5.4.0 build_runner: ^2.4.0
- 运行命令安装依赖:
flutter pub get
- 创建
test/calculator_mock.dart文件,内容:
import 'package:mockito/mockito.dart'; import '../lib/calculator.dart'; class MockCalculator extends Mock implements Calculator {}
- 运行命令生成Mock代码:
flutter pub run build_runner build
- 在测试文件中导入生成的Mock类:
import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import '../lib/calculator.dart'; import 'calculator_mock.dart'; // 导入生成的Mock类 void main() { // 测试逻辑不变 }
3. 确保Stub逻辑覆盖调用场景
如果调用add方法时的参数和when中预设的参数不匹配,Mock会返回null。比如测试中调用mockCalculator.add(3,4)但只预设了add(2,3),就会触发同样的错误。如果需要匹配任意参数,可以用any:
when(mockCalculator.add(any, any)).thenReturn(5);
验证修复
重新运行单元测试:
flutter test test/calculator_mock_test.dart
此时测试应该正常通过,不会再出现类型转换错误。
内容的提问来源于stack exchange,提问作者Bolt UIX
相关产品推荐
相关产品推荐

