I am using OCMock 3 to unit test my iOS project.
I use dispatch_once()
created a singleton class MyManager
:
@implementation MyManager
+ (id)sharedInstance {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
I have a method in School
class which uses the above singleton:
@implementation School
...
- (void) createLecture {
MyManager *mgr = [MyManager sharedInstance];
[mgr checkLectures];
...
}
@end
Now, I want to unit test this method, I use a partial mock of 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];
}
In tearDown
phase, I want to set the singleton instance to nil
so that the following test case could start from clean state.
I know on internet, some people suggest to move the static MyManager *sharedMyManager
outside the +(id)sharedInstance
method. But I would like to ask, is there any way to set the instance to nil without moving it outside +(id)sharedInstance
method? (Any solution like java reflection?)