Flutter使用Mocktail Mock background_downloader包时出现类型不匹配错误求助
Flutter使用Mocktail Mock background_downloader包时出现类型不匹配错误求助
我最近在尝试Mock background_downloader 这个包,具体是要Mock自己类里的这行代码:
var status = await fileDownloader.permissions.status(permissionType);
但一直卡在这里,收到的错误提示是:
<type 'Future' is not a subtype of type 'Permissions'>
我的测试类代码大概是这样的:
class MockFileDownloader extends Mock implements FileDownloader {} void main() { late MockFileDownloader mockFileDownloader; // 后续的测试初始化和业务逻辑代码 }
有没有大佬能帮我看看问题出在哪,该怎么解决呀?
问题分析和解决办法
别慌,这个错误大概率是Mock方法的返回值类型没处理对,我给你一步步理清楚:
先搞懂方法的返回类型
fileDownloader.permissions.status()这个方法的返回值是Future<Permissions>,所以我们Mock的时候必须返回一个包裹着Permissions实例的Future对象,不能直接返回Permissions本身,否则就会出现类型不匹配的问题。用Mocktail的正确API设置返回值
一定要用when配合thenAnswer来设置异步返回值,别用thenReturn。给你举个实际可用的例子:
// 在测试方法或者setUp函数里设置Mock返回逻辑 when(() => mockFileDownloader.permissions.status(any())) .thenAnswer((_) async => Permissions.granted); // 这里可以换成你需要的权限状态,比如denied
这里的async =>语法会自动把Permissions实例包装成Future<Permissions>,刚好匹配原方法的返回类型。
- 处理参数匹配的小细节
如果你的permissionType是枚举或者自定义类型,Mocktail需要一个fallback值来匹配any(),不然会报错。你可以在setUpAll里注册一个fallback值:
void main() { setUpAll(() { // 替换成你代码里实际用到的PermissionType枚举值 registerFallbackValue(PermissionType.storage); }); setUp(() { mockFileDownloader = MockFileDownloader(); }); test('测试权限检查逻辑', () async { // 先设置Mock返回 when(() => mockFileDownloader.permissions.status(any())) .thenAnswer((_) async => Permissions.granted); // 实例化你要测试的类并调用方法 final testClass = YourBusinessClass(mockFileDownloader); final permissionStatus = await testClass.checkDownloadPermission(); // 验证Mock方法是否被正确调用 verify(() => mockFileDownloader.permissions.status(any())).called(1); // 其他业务逻辑的断言 }); }
- 检查Mock类的实现
确保你的MockFileDownloader正确实现了FileDownloader的相关属性,特别是permissions——如果permissions本身是一个需要Mock的复杂对象,你可能需要单独Mock它,再让MockFileDownloader的permissions属性返回这个Mock对象。不过一般情况下,用Mocktail的Mock类实现FileDownloader后,配合上面的when设置返回值就足够了。
备注:内容来源于stack exchange,提问作者Mike6679
相关产品推荐
相关产品推荐

