我们一直在使用 OCMock 进行单元测试,它运行得非常好。 我们只是不确定它是如何运作的。猴子补丁?预处理时的代码生成?
我尝试用谷歌搜索但没有成功。
有人知道 OCMock 是如何发挥它的魔力的吗?
最佳答案
对于普通模拟上的实例方法,OCMock 使用 forwardInitation:
和 friend 。这类似于其他语言中缺少的动态代理或方法。有关更多详细信息,您可以从此处的代码开始:
- https://github.com/erikdoe/ocmock/blob/1f0f56c91a3e20917efbbb81c91be22f5b0f43a5/Source/OCMock/OCMockObject.m#L296-L319
- https://github.com/erikdoe/ocmock/blob/9eca5f781bd2cd362a5ea39ec98c038f9ce674c2/Source/OCMock/OCMStubRecorder.m#L97-L101
对于类方法和部分模拟,OCMock 使用猴子修补。在运行时,它创建类(对于部分模拟)或元类(对于类方法)的动态子类,然后将动态类切换为使用。代码的入口点:
- https://github.com/erikdoe/ocmock/blob/9eca5f781bd2cd362a5ea39ec98c038f9ce674c2/Source/OCMock/OCClassMockObject.m#L90-L160
- https://github.com/erikdoe/ocmock/blob/9eca5f781bd2cd362a5ea39ec98c038f9ce674c2/Source/OCMock/OCPartialMockObject.m#L104-L172
为了设置模拟和 stub ,OCMock 严重依赖 C 宏。它使用 block 的巧妙技巧来实现带有点和圆括号的语法。我第一次看到这个是在Expecta .
关于unit-testing - OCMock 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38852238/