Leem.fin
Leem.fin

Reputation: 42622

partial mock for class

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

Answers (2)

Gareth Shapiro
Gareth Shapiro

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

Erik Doernenburg
Erik Doernenburg

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

Related Questions