OCMock 是如何工作的?
How does OCMock works?
我们一直在使用 OCMock 进行单元测试,它运行得非常好。
我们只是不确定它是如何工作的。猴子修补?预处理代码生成?
我试过谷歌搜索但没有成功。
有人知道 OCMock 是如何做到这一点的吗?
对于普通模拟的实例方法,OCMock 使用 forwardInvocation:
和朋友。这类似于其他语言中缺少的动态代理或方法。有关详细信息,您可以从此处的代码开始:
- 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
对于 class 方法和部分模拟,OCMock 使用猴子修补。在运行时,它创建 class(对于部分模拟)或元 class(对于 class 方法)的动态子classes,然后切换动态 class投入使用。代码的入口点:
- 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
为了设置模拟和存根,OCMock 严重依赖 C 宏。它使用一个巧妙的块技巧来实现带有点和圆括号的语法。我第一次看到这个是在 Expecta.
我们一直在使用 OCMock 进行单元测试,它运行得非常好。 我们只是不确定它是如何工作的。猴子修补?预处理代码生成?
我试过谷歌搜索但没有成功。
有人知道 OCMock 是如何做到这一点的吗?
对于普通模拟的实例方法,OCMock 使用 forwardInvocation:
和朋友。这类似于其他语言中缺少的动态代理或方法。有关详细信息,您可以从此处的代码开始:
- 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
对于 class 方法和部分模拟,OCMock 使用猴子修补。在运行时,它创建 class(对于部分模拟)或元 class(对于 class 方法)的动态子classes,然后切换动态 class投入使用。代码的入口点:
- 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
为了设置模拟和存根,OCMock 严重依赖 C 宏。它使用一个巧妙的块技巧来实现带有点和圆括号的语法。我第一次看到这个是在 Expecta.