我是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。如果我期望AVCaptureSession上的另一种方法在AVAssetReader上不存在,那么它就会编译。我试过以下没有成功。它编译,但崩溃。
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];
这里的任何指导?
答案 0 :(得分:15)
如果您的变量是“id”但是在不同的类中使用不同的签名声明了方法,则应该通过将对象强制转换为正确的类型来帮助编译器,例如
[((AVCaptureSession *)[mockSession expect]) addOutput:[OCMArg any]];
在任何一种情况下,如果参数是一个对象,就像你的情况一样,你应该使用 any 而不是 anyPointer 。但你已经知道了一个。 ; - )
答案 1 :(得分:7)
id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect] addOutput:[OCMArg any]];