颤振中的 mockito 缺少存根错误。尝试在模拟的 SharedPreferences 上使用 setString

Posted

技术标签:

【中文标题】颤振中的 mockito 缺少存根错误。尝试在模拟的 SharedPreferences 上使用 setString【英文标题】:Missing stub error on mockito in flutter. Trying to use setString on mocked SharedPreferences 【发布时间】:2021-11-29 11:54:29 【问题描述】:

我正在尝试在我的颤振项目中使用 Mockito 模拟 sharedPreferences。这是错误日志。

package:mockito/src/mock.dart 190:7                                                                       Mock._noSuchMethod
package:mockito/src/mock.dart 184:45                                                                      Mock.noSuchMethod
test\feature\number_trivia\data\datasource\number_trivia_local_datasource_test.mocks.dart 67:14           MockSharedPreferences.setString
package:clean_arch_tdd/features/number_trivia/data/datasources/number_trivia_local_datasource.dart 31:30  NumberTriviaLocalDataSourceImpl.cacheLastNumberTrivia
test\feature\number_trivia\data\datasource\number_trivia_local_datasource_test.dart 51:18                 main.<fn>.<fn>

MissingStubError: 'setString'
No stub was found which matches the arguments of this method call:
setString('CACHED_NUMBER_TRIVIA', '"text":"Test trivia","number":1')

Add a stub for this method using Mockito's 'when' API, or generate the mock for MockSharedPreferences with 'returnNullOnMissingStub: true'.

错误是指这行代码。

local_data_source_test.dart

test('should call sharedPreferences to cache the data', () 
      dataSource.cacheLastNumberTrivia(tNumberTriviaModel);
      final expectedJsonString = jsonEncode(tNumberTriviaModel.toJson());
      verify(mockSharedPreferences.setString(
          cachedNumberTrivia, expectedJsonString));
    );

local_data_source.dart

@override
  Future<void> cacheLastNumberTrivia(NumberTriviaModel triviaToCache) 
    return sharedPreferences.setString(
        cachedNumberTrivia, jsonEncode(triviaToCache.toJson()));
  

它表明来自模拟 sharedPreferences 的方法 setString 丢失。我已经运行了 pub 命令来生成模拟。我在文件中还有一些使用 getString 方法的测试用例。而且效果很好。

有什么我遗漏的东西所以我不能使用 setString 方法吗?或者有什么办法可以解决这个问题?

提前致谢。

【问题讨论】:

请勿张贴代码图片或其他文字。将原文复制到您的问题中。 【参考方案1】:

我真的想通了,抱歉没有立即发布答案。

我发现自己忘记调用 setString 方法的存根了。这是代码。

group('cacheNumberTrivia', () 
    const tNumberTriviaModel =
        NumberTriviaModel(number: 1, text: 'Test trivia');

    test('should call sharedPreferences to cache the data', () async 
      when(mockSharedPreferences.setString(any, any))
          .thenAnswer((_) async => true);
      dataSource.cacheLastNumberTrivia(tNumberTriviaModel);
      final expectedJsonString = jsonEncode(tNumberTriviaModel.toJson());
      verify(mockSharedPreferences.setString(
          cachedNumberTrivia, expectedJsonString));
    );
  );

存根实际上是这一行:

when(mockSharedPreferences.setString(any, any))
          .thenAnswer((_) async => true);

在使用verify 验证结果之前,我忘记调用when 方法,因此会引发错误。

【讨论】:

以上是关于颤振中的 mockito 缺少存根错误。尝试在模拟的 SharedPreferences 上使用 setString的主要内容,如果未能解决你的问题,请参考以下文章

Mockito - 存根方法时出现 NullpointerException

在 Mockito 中检测到未完成的存根

使用Mockito模拟Apache HTTPClient

迁移空安全后颤振模拟单元测试错误

使用MockIto模拟声明

如何在颤振集成测试中模拟 http 请求?