您可以在 中返回不同的对象init
。这就是为什么你应该分配 to 的返回[super init]
值self
。尝试这样的事情:
@implementation Bar
- (id)init {
if (UNIT_TEST) {
self = [[StubBar alloc] init];
if (self) {
// do unit test init here
}
} else {
self = [super init];
if (self) {
// do regular init here
}
}
return self;
}
...
@end
注意:这应该在 ARC 下工作。如果您不使用 ARC,请确保self
在分配新StubBar
实例之前 release 。
如果您想避免将单元测试相关代码编译到您的主要目标中:
@implementation Bar
- (id)init {
#if UNIT_TEST
self = [[StubBar alloc] init];
if (self) {
// do unit test init here
}
#else
self = [super init];
if (self) {
// do regular init here
}
#endif
return self;
}
...
@end
如果您想完全分离单元测试和真实代码,您可以只拥有两个不同版本的Bar
类。一个将使用真实代码编译,另一个将使用单元测试目标。
您可以轻松地分配实例,而无需在编译时知道确切的类类型,如下所示:
id someBar = [[someClass alloc] init]; // assuming someClass is of type Class
或者:
id someBar = [[NSClassFromString(@"Bar") alloc] init];
不过第一个比较好。您可以使用它来拥有一个默认的类类型,您可以在进行单元测试时更改它。可以作为Foo
自身的属性,也可以作为您在单元测试时重新定义的预处理器宏。