如何使用 OCMock 测试类方法

Posted

技术标签:

【中文标题】如何使用 OCMock 测试类方法【英文标题】:How to test class methods using OCMock 【发布时间】:2013-07-01 09:31:48 【问题描述】:

不知道有没有办法使用OCMock可以分别调用一个类方法两次,就好像应用运行了两次,但实际上只运行一次。

我想测试一个类方法。由于方法内部存在一些静态变量,因此该方法一旦被调用就会一直保持其行为。因此我无法同时测试不同的行为。

当然,如果目的只是为了测试,我不能在课程中添加任何其他内容。

【问题讨论】:

最新版本不应该支持吗? 哦,标题很误导,我改一下。 我想测试一个类方法,而不是模拟它。实际上,我需要在方法中模拟其他东西以便对其进行测试。但挑战是方法中的静态变量只能设置一次。所以我想知道是否有一种方法可以像应用程序运行两次一样单独调用类方法两次,但实际上只有一次。 【参考方案1】:

没有办法在不通过 Objective-C 方法公开它们的情况下使用 OCMock 更改静态声明的变量。您说“当然”,您不能仅出于测试目的在课程中添加任何内容,但这并未被普遍接受。有一个完整的学派认为您的代码本身应该被设计为经过测试。

- (NSInteger)someStatic

    static NSInteger _someStatic = 42;
    return _someStatic;

如果您使用这样的模式(例如,可能有更好的模式),您可以模拟您的静态。虽然这会在使用静态的任何地方添加方法调用,但您可能会发现进行全面测试更为重要。

【讨论】:

见:***.com/questions/15656631/…【参考方案2】:

OCMock 2.1 版支持模拟类方法:

OCMock 2.1 发布

2013 年 3 月 15 日

新版本 (2.1) 添加了对存根类方法的支持并包含许多贡献的错误修复。此版本与 Xcode 4.5/4.6 兼容。

"Features" page on their website 给出了一些关于如何模拟类方法的示例:

类方法

[[[mock stub] andReturn:aValue] someClassMethod]

告诉模拟对象,当在创建模拟对象的类上调用 someClassMethod 时,它应该返回 aValue。这与用于存根实例方法的语法相同。

如果一个类方法应该被存根,但该类也有一个与该类方法同名的实例方法,则必须明确模拟该类方法的意图:

[[[[mock stub] classMethod] andReturn:aValue] aMethod]

类可以返回到它的原始状态,即所有的存根都将被删除:

[mock stopMocking]

只有在测试结束前必须恢复原始状态时才需要这样做。模拟在其自己的释放期间自动调用 stopMocking。 注意:如果添加了存根类方法的模拟对象没有被释放,存根方法将在测试中持续存在。如果多个模拟对象同时操作同一个类,则行为未定义。

【讨论】:

我读过这个,但不是我要找的。也许标题具有误导性。我会考虑一个新的。 @BingchenYang 那么也许你应该提出一个更详细的问题。你到底在用模拟做什么?存根?期望?拒绝?什么不工作?

以上是关于如何使用 OCMock 测试类方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OCMock 验证静态方法

OCMock 测试类别方法

void 方法的 OCMock 测试

如何使用OCMock验证在Objective C中不调用异步方法?

模拟另一个类方法的内部调用

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