我编写了一个 OCUnit 测试,它在 Xcode 3.2 中运行良好,现在我在 Xcode 4 中遇到了问题。它测试了X
class 中的单个静态函数A
,它不调用任何类或函数(在库函数之外)。唯一需要调用的其他代码是静态构造函数,它初始化两个静态变量,但同样,这些是不调用任何其他类或类函数的硬编码值(数组)A
。
然而,我必须为它导入的所有类以及它们导入的所有类包含 .m、.mm 和 .c 文件等等,以解决_OBJC_CLASS_$_ClassB",引用自:错误。我不不记得必须在 Xcode 3 中执行任何操作,但是很好,没问题,我可以编译它。现在,我收到了源自 classB
的错误+[B initialize]
。
为什么在没有以任何方式引用的类上调用静态构造函数?我该如何解决这个问题,理想情况下不改变我的课程来适应测试?
更新
为了进一步弄清楚发生了什么,我注释掉了我所有的测试用例#import "A.h"
,看看会发生什么。我添加了一个简单的单元测试:
- (void) testSomething {
STAssertTrue(NO, @"did it work?");
}
尽管如此,我+[B initialize]
的被调用并失败了。似乎 OCUnit 正在遍历我所有的类,并且+initialize
在此过程中调用了它们的方法。这对我来说毫无意义 - 我怎样才能禁用这种行为?
这是调用我自己的代码之前的堆栈跟踪,以防万一:
#7 _class_initialize ()
#8 prepareForMethodLookup ()
#9 lookUpMethod ()
#10 objc_msgSend ()
#11 +[NSObject(SenTestRuntimeUtilities) senIsASuperclassOfClass:] ()
#12 +[NSObject(SenTestRuntimeUtilities) senAllSubclasses] ()
#13 +[SenTestSuite updateCache] ()
#14 +[SenTestSuite suiteForBundleCache] ()
#15 +[SenTestSuite testSuiteForBundlePath:] ()
#16 +[SenTestProbe specifiedTestSuite] ()
#17 +[SenTestProbe runTests:] ()
#18 <????> ()
#19 <????> ()
#20 <????> ()
#21 <????> ()