我可以使用 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 到 proxy 或 wrap 原始类,以便对该类的任何方法调用都重定向到 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:如何测试两个指定块之一是不是被调用?