类的部分模拟

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];

【讨论】:

以上是关于类的部分模拟的主要内容,如果未能解决你的问题,请参考以下文章

String类的练习题

使用多线程模拟一个银行叫号窗口

PHPUnit 模拟一个抽象类的所有方法

来自 void 类的模拟异步调用

C++初阶---string类的模拟实现

来自另一个类的 PHPUnit 模拟方法