我可以使用 OCMock 测试是不是调用了超类吗?

Posted

技术标签:

【中文标题】我可以使用 OCMock 测试是不是调用了超类吗?【英文标题】:Can I use OCMock to test whether a super class gets called?我可以使用 OCMock 测试是否调用了超类吗? 【发布时间】:2013-11-02 07:53:46 【问题描述】:

我创建了一个 MKMapView 的子类。在单元测试中,我想知道当我调用这个子类的某个方法时,调用了相应的 MKMapView 方法以及参数的类。我可以使用 OCMock 来完成此操作吗?

编辑:

我接受了答案,但我想澄清一下,我的问题是关于何时不能在单元测试中直接替代超类(显然是这样,因为继承就是这样工作的)。 OCMock 和 OCMockito 似乎都只能用于注入到被测类中的对象。所以基本上,我认为我需要手动调配它们。

【问题讨论】:

【参考方案1】:

为了回答这个问题,让我们花一点时间来看看 OCMock 和类似框架是如何工作的:

Mocking 框架使用 Objective-C runtime 到 proxywrap 原始类,以便对该类的任何方法调用都重定向到 mocking 框架,这有一组预先录制的指令,说明调用给定方法时要做什么。

因此,答案是,是的,当你模拟一个类时,你也在隐式地模拟超类上的方法。您可以记录该方法将被调用的预期并验证这是否发生。您还可以验证提供的参数。

为了有效地使用模拟框架,没有必要知道细节,但是如果您有兴趣探索一些代理类的方法,请查看以下内容:

NSProxy Mike Ash's guide on swizzling 很调皮 bbum 的IMP_implentationWithBlock 文章。 Message Forwarding

顺便说一句,我个人最喜欢的模拟框架是OCMockito

【讨论】:

@huggie - 确实。值得庆幸的是,我们看到更多的框架实际上使用 swizzling 来做有用的事情。 . .不过,我仍在等待 a) AOP 框架和 b) 以更具表现力的方式修补硬连线或静态依赖项的东西。 既然你了解这么多内部原理,也许你可以尝试实现一个。 :) 我很乐意,但我目前的项目让我很忙:www.typhoonframework.org,我有很多其他项目的计划,但实际上你只能做这么多的副项目;) 使用 OCMockito 我无法弄清楚如何模拟课程。根据 Jon (***.com/questions/19799393/…) 的说法,这只是一个替身。如果我不调酒,我不明白它会如何模拟超级类。 OCMock 也不能。【参考方案2】:

我认为 OCMock 无法做到这一点。

请参阅 How to Test Calls to Super (iosunittesting.com)

我发现上面链接的帖子对解决这个常见问题非常有帮助。我最终做的是在超类上创建一个类别(仅在我的测试目标中),它覆盖有问题的方法并设置一些可以由测试用例检查的全局状态(帖子中的方法 #1)。

【讨论】:

以上是关于我可以使用 OCMock 测试是不是调用了超类吗?的主要内容,如果未能解决你的问题,请参考以下文章

GHUnit,OCMock:如何测试两个指定块之一是不是被调用?

如何使用 ocmock 验证部分模拟是不是具有使用 args 调用的基本方法?

如何使用 OCMock 测试类方法

使用具有未知数量的方法调用的 OCMock

使用从测试方法调用的方法的类的 OCMock

OCMock 无法识别被调用的选择器