OCMock自动使用testing代码中的模拟实例吗?

我是OCMock的新手 。

我使用dispatch_once()创build了一个单例类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 

现在,我想unit testing这个方法,我使用了MyManager的部分模拟:

 - (void) testCreateLecture { // create a partially mocked instance of MyManager id partialMockMgr = [OCMockObject partialMockForObject:[MyManager sharedInstance]]; // run method to test [schoolToTest createLecture]; ... } 

我注意到,在OCMock中,在我创build单例MyManager实例的部分模拟之后,在testing下运行我的方法时,它会自动使用部分模拟的实例。

这对我来说有点奇怪,因为在上面的testing案例中,我只创build了MyManager实例的部分模拟,而没有将其注入MyManager类,

当在testing代码中调用[MyManager sharedInstance]时,OCMock如何自动强制testing下的代码使用此[MyManager sharedInstance]实例? 有人可以向我解释这个吗?

partialMockForObject嘲笑你传递给它的对象。

在这种情况下,你正在嘲笑单身(共享)对象。 您不必注入任何东西,因为sharedInstance总是返回现在被嘲笑的同一个对象。 这仍然是相同的参考。

想象一下,部分嘲讽作为传递对象的一个​​简单的变异,它不会创build一个新的实例,所以你不必在这个特定的情况下注入它。

部分嘲笑非常酷。 在幕后,OCMock子类化你正在嘲笑的类,并且你存根的任何方法都在部分模拟子类中更新。 因此,所有对你的模拟类的引用现在默认为子类(模拟实现),而不是超类(你的实现)。 在这方面的参考文献中有一个很好的解释 。