如何使用OCMock测试类方法

时间:2013-07-01 09:31:49

标签: objective-c ocmock

我想知道是否有一种方法可以使用OCMock分别调用两次类方法,就像应用程序运行两次一样,但实际上只运行一次。

我想测试一个类方法。由于方法中的一些静态变量,该方法将在调用后始终保持其行为。因此,我不能同时测试不同的行为。

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

2 个答案:

答案 0 :(得分:1)

没有办法用OCMock改变静态声明的变量而不通过Objective-C方法暴露它们。你说“当然”你不能仅仅为了测试目的而在课堂上添加任何东西,但这并不是普遍接受的。有一整套思想认为你的代码本身应该被设计为经过测试。

- (NSInteger)someStatic
{
    static NSInteger _someStatic = 42;
    return _someStatic;
}

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

答案 1 :(得分:0)

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。   注意:如果未释放添加了存根类方法的模拟对象,则存根方法将在测试中保持不变。如果多个模拟对象同时操作同一个类,则行为未定义。