用 Mockito Flutter 模拟 Hive

Posted

技术标签:

【中文标题】用 Mockito Flutter 模拟 Hive【英文标题】:Mocking Hive with Mockito Flutter 【发布时间】:2021-08-07 06:14:04 【问题描述】:

所以基本上,当我想存储一些东西时,我想检查我是否已经传递了我需要传递给HiveInterfaceBox 的东西。

test.dart:

group('cacheStoraygeUser', () 
    test(
      'should call HiveInterface and Box to cache data',
      () async 
        when(mockHiveInterface.openBox(any)).thenAnswer((_) async => mockBox);
        when(mockBox.put(0, tStoraygeUserModel))
            .thenAnswer((_) async => tStoraygeUserModel);
        // act
        dataSourceImpl.cacheStoraygeUser(tStoraygeUserModel);
        // assert
        verify(mockHiveInterface.openBox(STORAYGE_USER_BOX));
        verify(mockBox.put(STORAYGE_USER_ENTRY, tStoraygeUserModel));
      ,
    );
  );

我对@9​​87654326@ 的实现:

@override
  Future<void> cacheStoraygeUser(
      StoraygeUserModel storaygeUserModelToCache) async 
    /// Precaution to ensure that [STORAYGE_USER_BOX] has been opened.
    ///
    /// If the box, is in fact not opened, Hive will just return the box since
    /// the box is a Singleton. I think.
    final box = await hiveInterface.openBox(STORAYGE_USER_BOX);
    box.put(STORAYGE_USER_ENTRY, storaygeUserModelToCache);
  

当我尝试运行测试时,它给出了这个错误:

type 'Null' is not a subtype of type 'Future<void>'
MockBox.put
package:hive/…/box/box_base.dart:80

我已经为HiveInterfaceBox 生成了模拟类。我认为如果我想测试 Hive,我应该这样做,因为我似乎无法为 Hive 本身生成 Mock 类。但如果您知道更好或更正确的解决方案,请告诉我。

我还编写了另一个从 Hive 获取内容的测试。这工作得很好。

test(
  'should return StoraygeUser from StoraygeUserBox when there is one in the cache',
  () async 
    // arrange
    when(mockHiveInterface.openBox(any)).thenAnswer((_) async => mockBox);
    when(mockBox.getAt(any)).thenAnswer((_) async => tStoraygeUserModel);
    // act
    final result = await dataSourceImpl.getCachedStoraygeUser();
    // assert
    verify(mockHiveInterface.openBox(any));
    verify(mockBox.getAt(any));
    expect(result, equals(tStoraygeUserModel));
  ,
);

提前致谢!

【问题讨论】:

可能是因为您在第一个代码中没有awaiting? 我改了一点await dataSourceImpl.cacheStoraygeUser(tStoraygeUserModel);,问题依旧 github.com/dart-lang/mockito/issues/412 【参考方案1】:

这个问题已在 Mockito 5.0.9 中修复

问题源于 Box 实现 BoxBase 而不是扩展它。

旧版本的 Mockito 无法识别这一点,因此在 mock 类中不会生成 putAt 和 getAt 以及其他方法。

【讨论】:

以上是关于用 Mockito Flutter 模拟 Hive的主要内容,如果未能解决你的问题,请参考以下文章

Mockito 用 Spring 模拟:“传递给 verify() 的参数不是模拟!”

使用 Mockito 时,模拟和间谍有啥区别?

Mockito - 模拟 ApplicationContext

如何在集成测试中模拟 BLoC

Mockito无法在SpringBoot中模拟接口类

使用 Mockito 的 FutureBuilder 快照数据为空 - Flutter