OCMock 在被测代码中自动使用模拟实例?
OCMock automatically use mocked instance in code under test?
我是 OCMock 的新人。
我用dispatch_once()
创建了一个单例classMyManager
:
@implementation MyManager
+ (id)sharedInstance {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
我在 School
class 中有一个使用上述单例的方法:
@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];
...
}
我注意到使用 OCMock,在我创建了我的单例 MyManager
实例的部分模拟之后,当 运行 我的方法被测试时,它 自动 使用部分模拟的实例。
这对我来说有点奇怪,因为在我上面的测试用例中,我只创建了 MyManager
实例的部分模拟,而没有将其注入 MyManager
class,
OCMock如何在被测代码中调用[MyManager sharedInstance]
时自动强制被测代码使用这个mocked实例?有人可以给我解释一下吗?
部分模拟非常酷。在幕后,OCMock subclasses 你正在模拟的 class,你存根的任何方法都会在部分模拟 subclass 中更新。因此,所有对您的模拟 class 的引用现在将默认为 subclass (模拟实现)而不是 superclass (您的实现)。这方面也有很好的explanation in the reference。
partialMockForObject
模拟您传递给它的对象。
在这种情况下,您正在模拟单例(共享)对象。您不必注入任何东西,因为 sharedInstance
总是返回同一个对象,现在被模拟了。还是一样的引用。
将部分模拟想象成传递对象的简单突变,它不会创建新实例,因此您不必在这种特定情况下注入它。
我是 OCMock 的新人。
我用dispatch_once()
创建了一个单例classMyManager
:
@implementation MyManager
+ (id)sharedInstance {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
我在 School
class 中有一个使用上述单例的方法:
@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];
...
}
我注意到使用 OCMock,在我创建了我的单例 MyManager
实例的部分模拟之后,当 运行 我的方法被测试时,它 自动 使用部分模拟的实例。
这对我来说有点奇怪,因为在我上面的测试用例中,我只创建了 MyManager
实例的部分模拟,而没有将其注入 MyManager
class,
OCMock如何在被测代码中调用[MyManager sharedInstance]
时自动强制被测代码使用这个mocked实例?有人可以给我解释一下吗?
部分模拟非常酷。在幕后,OCMock subclasses 你正在模拟的 class,你存根的任何方法都会在部分模拟 subclass 中更新。因此,所有对您的模拟 class 的引用现在将默认为 subclass (模拟实现)而不是 superclass (您的实现)。这方面也有很好的explanation in the reference。
partialMockForObject
模拟您传递给它的对象。
在这种情况下,您正在模拟单例(共享)对象。您不必注入任何东西,因为 sharedInstance
总是返回同一个对象,现在被模拟了。还是一样的引用。
将部分模拟想象成传递对象的简单突变,它不会创建新实例,因此您不必在这种特定情况下注入它。