Reputation: 42622
I am using OCMock to do unit test. I know there is a function from OCMock which can partially mock an object. I mean this one:
[OCMockObject partialMockForObject:anObject]
But, I have a class which only consists class functions. E.g. MyHelperClazz
class, I only use it like [MyHelperClazz helperFunc]
.
I need to mock some functions in MyHelperClazz
, but for others I want my test code to run real implementation of MyHelperClazz
. So, I need to partial mock it. But it is a class not a object.
How can I partially mock a class with OCMock? If it is impossible, how to achieve my goal?
Upvotes: 1
Views: 854
Reputation: 36
I achieved this with NSUserDefaults
like so.
ClassThatUsesNSDefaults *nsDefaultsConsumer = [[ClassThatUsesNSDefaults alloc] init];
// Make an instance of the thing to partially mock
id partialUserDefaultsMock = OCMPartialMock([NSUserDefaults standardUserDefaults]);
// Configure the partial mocked parts
OCMStub([partialUserDefaultsMock boolForKey:@"interesting-key"]).andReturn(YES);
OCMStub([partialUserDefaultsMock stringForKey:@"another-interesting-key"]).andReturn(@"interesting-value");
// Set up a class mock and have a static accessor return your partial mock,
// this even works with nasty singletons.
id mockedUserDefaultsClass = OCMClassMock([NSUserDefaults class]);
OCMStub([mockedUserDefaultsClass standardUserDefaults]).andReturn(partialUserDefaultsMock);
// Test Away
BOOL isEverythingOK = [nsDefaultsConsumer isEverythingOK];
XCTAssertTrue(isEverythingOK);
// Don't forget
[particalUserDefaultsMock stopMocking];
[mockedUserDefaultsClass stopMocking];
Upvotes: 0
Reputation: 3014
A normal class mock allows you to mock instance methods of that class, and it allows you to mock class methods of the class. Please see the documentation: http://ocmock.org/reference/#mocking-class-methods
Upvotes: 0