Mockito单元测试报MissingStubError: 'commit'无匹配存根问题
报错原因
你用的新版Mockito默认开启严格存根校验:所有mock对象上被实际调用到的方法,都必须提前通过when配置存根,否则就会抛出MissingStubError。
你当前代码只给database.batch()做了存根,但是返回的mock batch实例上调用的delete、commit方法都没有提前配置存根,所以触发报错。你之前猜测要补充存根配置的思路完全正确,之前写了报错基本是参数匹配不对、或者异步方法返回值类型不匹配导致的。
修复方法
直接在测试的arrange阶段,把batch对象上所有会被调用的方法都补上对应存根即可,修改后的完整测试代码:
test('should perform database batch delete of chat', () async { //arrange final chatId = '111'; when(database.batch()).thenReturn(batch); // 配置delete方法存根,任意参数匹配即可,delete无有效返回值 when(batch.delete(any, where: anyNamed('where'), whereArgs: anyNamed('whereArgs'))) .thenReturn(null); // 配置commit方法存根,commit是异步方法,需要返回Future类型匹配返回值要求 when(batch.commit( noResult: anyNamed('noResult'), exclusive: anyNamed('exclusive'), continueOnError: anyNamed('continueOnError') )).thenAnswer((_) async => []); //act await sut.deleteChat(chatId); //assert verifyInOrder([ database.batch(), batch.delete('messages', where: anyNamed('where'), whereArgs: [chatId]), batch.delete('chats', where: anyNamed('where'), whereArgs: [chatId]), batch.commit(noResult: true) ]); });
可选简化配置
如果不想给每个mock方法单独写存根,可以调整mock生成规则,给Batch的mock类开启未匹配存根返回null的配置:
@GenerateMocks([ // 你原本要mock的其他类,比如Database ], customMocks: [ MockSpec<Batch>(returnNullOnMissingStub: true), ])
配置完成后重新执行build runner命令生成新的mock文件即可。
注意:这个宽松模式对返回Future/Stream的异步方法不生效,因为默认返回的null和异步返回值类型不匹配,运行时还是会抛类型错误,涉及异步方法的存根还是建议单独配置,优先选手写存根的方案稳定性更高。
内容的提问来源于stack exchange,提问作者JohnBradens
相关产品推荐
相关产品推荐

