我正在使用OCMock 3来对我的iOS项目进行单元测试。
我使用dispatch_once()
创建了一个单例类MyManager
:
@implementation MyManager
+ (id)sharedInstance {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
我在School
类中有一个方法,它使用上述的单例:
@implementation School
...
- (void) createLecture {
MyManager *mgr = [MyManager sharedInstance];
[mgr checkLectures];
...
}
@end
现在我想对这个方法进行单元测试,我使用 MyManager 的部分模拟:
- (void) testCreateLecture {
// create a partially mocked instance of MyManager
id partialMockMgr = [OCMockObject partialMockForObject:[MyManager sharedInstance]];
// run method to test
[schoolToTest createLecture];
...
}
- (void)tearDown {
// I want to set the singleton instance to nil, how to?
[super tearDown];
}
在tearDown
阶段,我想将单例实例设置为nil
,以便以下测试用例可以从干净的状态开始。
我知道在互联网上,有些人建议将static MyManager *sharedMyManager
移到+(id)sharedInstance
方法之外。但是我想问一下,是否有任何方法可以在不移动它到+(id)sharedInstance
方法之外的情况下将实例设置为nil
?(有没有类似于Java反射的解决方案?)