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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 11:27:15