5

我正在尝试使用 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?

如果你模拟 +new,我发现问题会更糟。我创建 bar 的最后一行因错误的字符串哈希或堆栈溢出而爆炸(我不确定如何始终如一地获得其中一个,我已经看到了两者)。

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

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

4

0 回答 0