场景
被测函数中有一个类似这样的判断:
if ([[UIDevice currentDevice] systemVersion].floatValue >= 9.0){
...
}else{
...
}
现需要在单元测试中对[[UIDevice currentDevice] systemVersion]进行模拟,以便其根据我们测试的需要返回我们指定的值。
解决
id devMock = OCMPartialMock([UIDevice currentDevice]);
OCMStub([(UIDevice *)devMock systemVersion]).andReturn(@"9.0");
//调用
...
//断言
...
[devMock stopMocking];
分析
UIDevice是单例,所以要么使用部分模拟OCMPartialMock
要么同时对currentDevice
进行OCMStub
,使其返回我们的mock实例对象。
如果是第二种方法,代码如下:
id devMock = OCMClassMock([UIDevice class]);
OCMStub([devMock currentDevice]).andReturn(devMock);
OCMStub([devMock systemVersion]).andReturn(@"9.0");
//调用
...
//断言
...
[devMock stopMocking];
但是会报错:
我也不知道怎么解决,所以就使用了第一种方法,用部分模拟。
用部分模拟,也一样有一个错误。
所以使用了一个强制转换,告诉编译器使用哪一个systemVersion
方法。