如何在Dart中对AppInfoHelper类进行单元测试并Mock内部方法
解决方案
首先,你需要稍微改造原类,让getPackageInfo()方法能够被重写(Dart中默认方法支持重写,只要不是final或static修饰,你的原类已经满足这个条件),这样就能在测试中替换它的实现。
步骤1:准备Mock类
使用mockito创建一个继承自AppInfoHelper的Mock类,用来StubgetPackageInfo()方法:
import 'package:mockito/mockito.dart'; import 'package:package_info_plus/package_info_plus.dart'; class MockAppInfoHelper extends Mock implements AppInfoHelper { @override Future<PackageInfo> getPackageInfo() async { return super.noSuchMethod(Invocation.method(#getPackageInfo, []), returnValue: Future.value(PackageInfo())); } }
或者使用mockito的代码生成功能(推荐),在test目录下创建mock_app_info_helper.dart,添加注解:
import 'package:mockito/mockito.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'your_app_info_helper_path.dart'; @GenerateMocks([AppInfoHelper], customMocks: [ MockSpec<AppInfoHelper>(onMissingStub: OnMissingStub.returnDefault), ]) void main() {}
运行flutter pub run build_runner build生成mock类。
步骤2:编写单元测试
在测试文件中,初始化Mock类,StubgetPackageInfo()返回预设的PackageInfo实例,然后验证各个方法的返回值是否符合预期:
import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'your_app_info_helper_path.dart'; import 'mock_app_info_helper.dart'; void main() { late MockAppInfoHelper mockAppInfoHelper; late PackageInfo mockPackageInfo; setUp(() { mockAppInfoHelper = MockAppInfoHelper(); // 预设模拟的PackageInfo数据 mockPackageInfo = PackageInfo( appName: 'TestApp', version: '1.0.0', buildNumber: '100', packageName: 'com.test.app', buildSignature: '', ); // Stub getPackageInfo方法,返回预设的mockPackageInfo when(mockAppInfoHelper.getPackageInfo()).thenAnswer((_) async => mockPackageInfo); }); test('getAppName应返回预设的应用名称', () async { final result = await mockAppInfoHelper.getAppName(); expect(result, 'TestApp'); // 验证getPackageInfo被调用了一次 verify(mockAppInfoHelper.getPackageInfo()).called(1); }); test('getAppVersion应返回预设的版本号', () async { final result = await mockAppInfoHelper.getAppVersion(); expect(result, '1.0.0'); verify(mockAppInfoHelper.getPackageInfo()).called(1); }); test('getBuildNumber应返回预设的构建号', () async { final result = await mockAppInfoHelper.getBuildNumber(); expect(result, '100'); verify(mockAppInfoHelper.getPackageInfo()).called(1); }); }
替代方案:使用Spy(Dart mockito 5+支持)
如果你使用的是mockito 5及以上版本,已经支持Spy功能,可以直接包装真实的AppInfoHelper实例,然后Stub特定方法:
import 'package:mockito/mockito.dart'; void main() { late AppInfoHelper realHelper; late SpyAppInfoHelper spyHelper; late PackageInfo mockPackageInfo; setUp(() { realHelper = AppInfoHelper(); spyHelper = spy(realHelper); mockPackageInfo = PackageInfo( appName: 'TestApp', version: '1.0.0', buildNumber: '100', packageName: 'com.test.app', buildSignature: '', ); when(spyHelper.getPackageInfo()).thenAnswer((_) async => mockPackageInfo); }); // 测试用例和上面一致 }
内容的提问来源于stack exchange,提问作者ikhsanudinhakim
相关产品推荐
相关产品推荐

