2012-05-03 4 views
5

Voglio simulare un metodo di istanza per tutte le istanze di una classe utilizzando OCMock tuttavia non ho l'istanza della classe per sovrascriverla piuttosto che viene creata all'interno del metodo che sto testando.Mocking di un metodo in OCMock per tutte le istanze di una classe

Quindi la mia domanda è: è possibile sovrascrivere questo metodo per tutte le istanze di una classe o sarà necessario iniettare quell'istanza nel metodo piuttosto che crearla all'interno del metodo?

cioè

[[ClassThatHasTheInstanceMethodToOverride andCall:@selector(callThisMethodInstead) onObject:self] someInstanceMethod]; 

risposta

1

sono arrivato alla fine con questo set di metodi:

Metodo originalMethod = nil; Metodo swizzleMethod = nil;

#import <objc/runtime.h> 

.... 

- (void) swizzleInstanceMethodForInstancesOfClass:(Class)targetClass selector:(SEL)selector 
{ 
    originalMethod = class_getInstanceMethod(targetClass, selector); 
    swizzleMethod = class_getInstanceMethod([self class], selector); 
    method_exchangeImplementations(originalMethod, swizzleMethod); 
} 

- (void) deswizzle 
{ 
    method_exchangeImplementations(swizzleMethod, originalMethod); 
    swizzleMethod = nil; 
    originalMethod = nil; 
}