类的部分模拟
Posted
技术标签:
【中文标题】类的部分模拟【英文标题】:partial mock for class 【发布时间】:2016-06-28 14:13:36 【问题描述】:我正在使用OCMock 进行单元测试。我知道 OCMock 有一个函数可以部分模拟 对象。我的意思是这个:
[OCMockObject partialMockForObject:anObject]
但是,我有一个只包含类函数的类。例如。 MyHelperClazz
类,我只像[MyHelperClazz helperFunc]
那样使用。
我需要模拟MyHelperClazz
中的一些函数,但对于其他函数,我希望我的测试代码能够运行MyHelperClazz
的真实实现。所以,我需要部分模拟它。但它是一个类而不是一个对象。
如何使用 OCMock 部分模拟类?如果不可能,如何实现我的目标?
【问题讨论】:
【参考方案1】:一个普通的类模拟允许你模拟那个类的实例方法,它允许你模拟这个类的类方法。请参阅文档:http://ocmock.org/reference/#mocking-class-methods
【讨论】:
【参考方案2】:我通过NSUserDefaults
实现了这一点。
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];
【讨论】:
以上是关于类的部分模拟的主要内容,如果未能解决你的问题,请参考以下文章