【发布时间】:2013-01-09 19:54:58
【问题描述】:
我是 OCMock 的新用户,所以也许我只是在这里遗漏了一些简单的东西。此代码无法编译:
id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[[mockSession expect] addOutput:[OCMArg anyPointer]];
错误是
Multiple methods named 'addOutput:' found with mismatched result, parameter type or attributes
AVCaptureSession上addOutput方法的签名如下
- (void)addOutput:(AVCaptureOutput *)output
据我所知,问题在于方法 addOutput 存在于 AVCaptureSession 和 AVAssetReader 类中。 AVAssetReader 上 addOutput 的方法签名如下。
- (void)addOutput:(AVAssetReaderOutput *)output
显然编译器认为我的 mockSession 是一个 AVAssetReader,但我不知道为什么它选择那个类而不是 AVCaptureSession。如果我期望在 AVAssetReader 上不存在的 AVCaptureSession 上使用不同的方法,那么它会编译。我尝试了以下但没有成功。它可以编译,但会崩溃。
id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect] addOutput:[OCMArg anyPointer]];
这段代码也不能编译,和上一个错误一样
id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[[mockSession expect] addOutput:output];
这里有什么指导吗?
【问题讨论】:
-
为什么要创建
id类型的对象? -
他没有创建“id”类型的对象。他只是将对象分配给 id 类型的变量。这是模拟对象的常用技术,因为使用 id 允许您将对象传递到需要真实对象的任何地方并且您也可以调用模拟对象的特殊方法。
-
有没有人为 OCMock 方法本身看过这个?我有一个完全不相关的类,带有一个名为“reject”的方法,编译器给了我与 OP 相同的错误,但这是当我尝试使用
[mock reject]时。使用较新的 OCMExpect 语法,这不是问题,但看起来拒绝尚未转换。
标签: ios objective-c unit-testing ocmock