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

OCMStub报Did not record an invocation错误,模拟Singleton单例失败如何解决?

报错诱因

本次报错完全匹配错误提示给出的第一个触发条件:OCMStub括号内的方法调用的接收者不是mock对象。
你写的OCMStub([MySingletonController sharedController])中,sharedController方法的调用方是MySingletonController真实类,不是你提前创建的mockController mock实例,OCMock无法对真实类的方法调用做stub记录,所以直接抛出内部一致性异常。
你补充的sharedController仅返回nib初始化变量的逻辑和本次报错没有任何关联。

修复方案

方案1:标准类方法Stub写法(适配OCMock 3.x及以上版本)

将stub语句中的方法接收者替换为类对象并强转id即可,完整代码如下:

MySingletonController *mockController = OCMClassMock([MySingletonController class]);
OCMStub([(id)[MySingletonController class] sharedController]).andReturn(mockController);

方案2:低版本OCMock兼容写法

如果使用的是OCMock 2.x版本,可以用显式声明类方法stub的写法:

MySingletonController *mockController = OCMClassMock([MySingletonController class]);
[[[mockController stub] classMethod] sharedController];
OCMStub([mockController sharedController]).andReturn(mockController);

方案3:无OCMock版本依赖方案

在测试Target中创建MySingletonController的分类,重写sharedController方法直接返回mock对象,该写法不需要修改原有stub逻辑也可实现单例替换:

// 仅在测试Target中引入该分类
@implementation MySingletonController (UnitTest)
+ (instancetype)sharedController {
    // 返回你提前创建的全局mock对象即可
    return globalMockController;
}
@end

内容的提问来源于stack exchange,提问作者Jacobo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:09:00