Flutter Hive单元测试报错:put方法返回Null不匹配Future<void>
问题:Hive put方法测试报错:type 'Null' is not a subtype of type 'Future'
函数实现
class AppLocalDataSourceImpl implements AppLocalDataSource { static const _kTag = "AppLocalDataSource"; final Box _appBox; AppLocalDataSourceImpl({required Box appBox}) : _appBox = appBox; @override Future<void> updateAppCountry(CountryModel country) async { try { await _appBox.put( CacheKeys.ckAppCountry, country, ); } catch (e) { logError("$_kTag updateAppCountry Error: $e"); throw LocalStorageException( errLogMessage: localStorageErrorMessage(e.toString()), ); } } }
测试代码
class MockBox extends Mock implements Box<dynamic> {} void main() { group('AppLocalDataSourceImpl Tests', () { late AppLocalDataSourceImpl dataSource; late MockBox mockBox; setUp(() async { mockBox = MockBox(); dataSource = AppLocalDataSourceImpl(appBox: mockBox); }); test('updateAppCountry calls put with correct parameters', () async { // Arrange const country = CountryModel( id: 1, icon: 'icon_url', name: 'Test Country', code: 'TC', currency: CurrencyModel(id: 1, currency: 'USD', name: 'US Dollar'), ); when(mockBox.put(any, any)).thenAnswer((inn) async => Future.value()); // Act await dataSource.updateAppCountry(country); // Assert verify(mockBox.put(CacheKeys.ckAppCountry, country)).called(1); }); }); }
错误信息
00:02 +6 -1: AppLocalDataSourceImpl Tests updateAppCountry calls put with correct parameters [E] type 'Null' is not a subtype of type 'Future<void>' test/src/core/app_data/data_source/local/app_local_data_source_impl_test.dart 11:7 MockBox.put test/src/core/app_data/data_source/local/app_local_data_source_impl_test.dart 124:20 main.<fn>.<fn> To run this test again: /Users/macbook/Dev/flutter/bin/cache/dart-sdk/bin/dart test /Users/macbook/StudioProjects/TravelApp/test/src/core/app_data/data_source/local/app_local_data_source_impl_test.dart -p vm --plain-name 'AppLocalDataSourceImpl Tests updateAppCountry calls put with correct parameters' 00:02 +6 -1: Some tests failed.
原因分析
Hive的Box.put方法包含三个参数:key、value和可选参数override(默认值为true)。测试代码中,when(mockBox.put(any, any))仅匹配了前两个参数,未处理第三个可选参数,导致该mock配置未被命中。Mock类未配置的方法默认返回Null,而业务代码中await了这个Null值,因此触发类型转换错误。
解决方案
修改测试代码中的when和verify语句,匹配put方法的所有参数(包括可选的override参数):
修改后的测试代码片段
// Arrange部分 when(mockBox.put(any, any, any)).thenAnswer((_) async => Future<void>.value()); // Assert部分 verify(mockBox.put(CacheKeys.ckAppCountry, country, true)).called(1);
若无需指定具体的override值,也可用any匹配:
verify(mockBox.put(CacheKeys.ckAppCountry, country, any)).called(1);
这样可确保mock的put方法被正确触发,返回合法的Future<void>,解决类型转换错误。
内容的提问来源于stack exchange,提问作者Adham Khaled
相关产品推荐
相关产品推荐

