我测试的功能非常简单:
@implementation MyHandler
...
-(void) processData {
DataService *service = [[DataService alloc] init];
NSDictionary *data = [service getData];
[self handleData:data];
}
@end
I use OCMock 3 http://ocmock.org/reference/对它进行单元测试。
我需要stub the [[DataService alloc] init]
返回一个模拟实例,我尝试了从这个问题回答 https://stackoverflow.com/questions/18503604/how-to-mock-an-object-with-ocmock-which-isnt-passed-as-a-parameter-to-method(这是一个公认的答案)存根[[SomeClazz alloc] init]
:
// Stub 'alloc init' to return mocked DataService instance,
// exactly the same way as the accepted answer told
id DataServiceMock = OCMClassMock([DataService class]);
OCMStub([DataServiceMock alloc]).andReturn(DataServiceMock);
OCMStub([DataServiceMock init]).andReturn(DataServiceMock);
// run function under test
[MyHandlerPartialMock processData];
// verify [service getData] is invoked
OCMVerify([dataServiceMock getData]);
我确信我已经在测试的函数中设置了断点[service getData]
运行单元测试时调用,但我上面的测试代码(OCMVerify)失败。为什么?
是不是因为被测函数没有使用我的mocked DataService
?但该问题中接受的答案表明它应该有效。我现在很困惑...
我想知道如何存根[[SomeClazz alloc] init]
使用 OCMock 返回模拟实例?
你不能嘲笑init
因为它是由模拟对象本身实现的。嘲笑的原因init
在您链接的答案中起作用是因为它是自定义初始化方法。如果您不想使用依赖注入,则必须编写自定义的init
方法用于DataService
你可以嘲笑。
在您的实现中添加自定义init
method:
// DataService.m
...
- (id) initForTest
{
self = [super init];
if (self) {
// custom initialization here if necessary, otherwise leave blank
}
return self;
}
...
然后更新MyHandler
调用这个的实现initForTest
:
@implementation MyHandler
...
-(void) processData {
DataService *service = [[DataService alloc] initForTest];
NSDictionary *data = [service getData];
[self handleData:data];
}
@end
最后将您的测试更新为存根initForTest
:
id DataServiceMock = OCMClassMock([DataService class]);
OCMStub([DataServiceMock alloc]).andReturn(DataServiceMock);
OCMStub([DataServiceMock initForTest]).andReturn(DataServiceMock);
// run function under test
[MyHandlerPartialMock processData];
// verify [service getData] is invoked
OCMVerify([dataServiceMock getData]);
随意重命名initForTest
, 只要它不被调用init
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)