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
相关产品推荐
相关产品推荐

