我做了一个 MKMapView 的子类。在单元测试中,我想知道当我调用这个子类的某个方法时,调用了相应的 MKMapView 方法以及参数的类。我可以使用 OCMock 来完成此操作吗?
编辑:
我接受了答案,但我想澄清一下,我的问题是关于何时不能在单元测试中直接替代超类(显然是这样,因为继承就是这样工作的)。并且似乎 OCMock 和 OCMockito都只能用于注入到被测类中的对象。所以基本上,我认为我需要手动调配它们。
我做了一个 MKMapView 的子类。在单元测试中,我想知道当我调用这个子类的某个方法时,调用了相应的 MKMapView 方法以及参数的类。我可以使用 OCMock 来完成此操作吗?
编辑:
我接受了答案,但我想澄清一下,我的问题是关于何时不能在单元测试中直接替代超类(显然是这样,因为继承就是这样工作的)。并且似乎 OCMock 和 OCMockito都只能用于注入到被测类中的对象。所以基本上,我认为我需要手动调配它们。
为了回答这个问题,让我们花一点时间来看看 OCMock 和类似框架是如何工作的:
模拟框架使用Objective-C 运行时来代理或包装原始类,因此对该类的任何方法调用都将重定向到模拟框架,该框架具有预先记录的一组指令,说明当给定方法时要做什么被调用。
因此,答案是,是的,当你模拟一个类时,你也在隐式模拟超类上的方法。您可以记录该方法将被调用的预期并验证这是否发生。您还可以验证提供的参数。
为了有效地使用模拟框架,没有必要知道细节,但是如果您有兴趣探索一些代理类的方法,请查看以下内容:
顺便说一句,我个人最喜欢的模拟框架是OCMockito
我不认为 OCMock 可以做到这一点。
请参阅如何测试对 Super 的调用(iosunittesting.com)
我发现上面链接的帖子对这个常见问题非常有帮助。我最终做的是在超类上创建一个类别(仅在我的测试目标中),它覆盖有问题的方法并设置一些可以由测试用例检查的全局状态(帖子中的方法#1)。