我有一个Worker
类,标题为:
@interface Worker : NSObject {
// instance variable `task`
MyTask *task;
}
@end
初始化方法是这样的:
@implementation Worker
-(id)initWithName:(NSString*)name{
self = [super init];
if (self) {
// I need to use mocked task in my test case
task = [[MyTask alloc] init];
...
...
}
return self
}
-(void)doWork{
[task start];
}
我想对这个类进行单元测试,我正在使用OCMock库来进行模拟。我知道我可以通过以下方式创建一个模拟任务:
id mockedTask = OCMClassMock([MyTask class]);
但是,如何在测试用例中将此模拟任务注入我的 Worker
实例?我的意思是当我在测试类中创建一个Worker实例时,在初始化方法中创建任务:
-(void)setup{
// how to inject the mocked task in to this workerUnderTest
Worker *workerToTest = [[Worker alloc] initWithName:@"John"];
}
我需要在测试中使用模拟任务。我怎样才能实现它?
====我的测试用@Syashok的答案(它没有用)====
@interface WorkerTestCase : XCTestCase
@end
@implementation WorkerTestCase{
Worker *workerToTest;
id mockedTask;
}
- (void)setUp {
[super setUp];
workerToTest = [[Worker alloc] initWithName:@"John"];
mockedTask = OCMClassMock([MyTask class]);
OCMStub([workerToTest task]).andReturn(mockedTask);
}
-(void) testDoWork{
[workerToTest doWork];
// it fails. method is not invoked!
OCMVerify([mockedTask start]);
}
...
@end
如上所述,我的测试用例失败,它抱怨mockedTask
对象没有调用。但是当我将断点设置为实际类实现时,调用[task start]
,表明mockedTask
未成功注入。
答案 0 :(得分:0)
您可以使用下面的OCMStub()
注入它,您需要将task
ivar声明为属性
@interface Worker : NSObject
@property(nonatomic,strong)MyTask *task;
@end
//
id mockedTask = OCMClassMock([MyTask class]);
OCMStub([workerToTest task]).andReturn(mockedTask);
你的方法看起来像
-(void)setup{
// how to inject the mocked task in to this workerUnderTest
Worker *workerToTest = [[Worker alloc] initWithName:@"John"];
id mockedTask = OCMClassMock([MyTask class]);
OCMStub([workerToTest task]).andReturn(mockedTask);
}