OCMock没有清理存根类方法

时间:2013-07-24 00:06:07

标签: objective-c unit-testing ocmock

我正在尝试使用OCMock来模拟内部类依赖(例如,我的类使用NSMutableData并验证模拟NSMutableData)。具体来说,我正在嘲笑返回模拟对象的工厂方法。

据我所知,模拟对象没有清理类方法模拟,或只是部分清理它们。这对不相关的测试产生了相当不利的影响,最终可能会调用相同的类方法。

一个简短的例子,我已经能够在当地重新说明:

id data1 = [NSMutableData data];    // new instance
id data2 = [NSMutableData data];    // new instance

// mock +data and have it return data1
id mock = [OCMockObject mockForClass:[NSMutableData class]];
[[[[mock stub] classMethod] andReturn:data1] data];

id foo = [NSMutableData data];  // foo == data1 ok that's good

[mock stopMocking];
mock = nil;                     // using ARC so no explicit -release

id bar = [NSMutableData data];  // bar == data1, wait what? shouldn't this be new?

如果你模拟+新的话,我发现问题更严重。我创建条形图的最后一行用坏的字符串散列或堆栈溢出(我不确定如何一致地得到一个或另一个,我已经看到了两个)。

我意识到有办法解决这个问题。我可以在我的类中注入一个NSMutableData实例,这感觉就像矫枉过正,因为它不是一个硬依赖。我可以在我的类上创建一个创建NSMutableData的实例方法,并且我部分地模拟我的类而不是注入模拟。这很好,但我真的想知道为什么这个特殊情况不起作用。如果我能够实际存根工厂方法,那么模拟内部依赖会更容易!

这个问题并不局限于NS类的任何特定内容(我知道有关模拟NSString的限制),因为我可以轻松地使用我自己的类重现上述问题。

0 个答案:

没有答案