You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:09:49