OCMock方法名称冲突

Ben*_*n H 11 unit-testing objective-c ocmock ios

我是OCMock的新用户,所以也许我只是在这里错过了一些简单的东西.此代码无法编译:

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[[mockSession expect]  addOutput:[OCMArg anyPointer]];
Run Code Online (Sandbox Code Playgroud)

错误是

Multiple methods named 'addOutput:' found with mismatched result, parameter type or attributes
Run Code Online (Sandbox Code Playgroud)

AVCaptureSession上方法addOutput的签名如下

- (void)addOutput:(AVCaptureOutput *)output
Run Code Online (Sandbox Code Playgroud)

据我所知,问题是方法addOutput存在于AVCaptureSession和AVAssetReader类中.AVAssetReader上addOutput的方法签名如下.

- (void)addOutput:(AVAssetReaderOutput *)output
Run Code Online (Sandbox Code Playgroud)

显然编译器认为我的mockSession是一个AVAssetReader,但我不知道为什么它选择该类而不是AVCaptureSession.如果我期望AVCaptureSession上的另一种方法在AVAssetReader上不存在,那么它就会编译.我试过以下没有成功.它编译,但崩溃.

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect]  addOutput:[OCMArg anyPointer]];
Run Code Online (Sandbox Code Playgroud)

此代码也不编译,与前一个错误相同

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[[mockSession expect]  addOutput:output];
Run Code Online (Sandbox Code Playgroud)

这里的任何指导?

Eri*_*urg 15

如果您的变量是"id"但是在不同的类中使用不同的签名声明了方法,则应该通过将对象强制转换为正确的类型来帮助编译器,例如

[((AVCaptureSession *)[mockSession expect])  addOutput:[OCMArg any]];
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,如果参数是一个对象,就像你的情况一样,你应该使用any而不是anyPointer.但你已经知道了一个.;-)


Ben*_*n H 7

好吧,我认为它搞清楚了.我怀疑,这是一个简单的菜鸟错误.将[OCMArg anyPointer]更改为[OCMArg any]可以完成以下工作:

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect]  addOutput:[OCMArg any]];
Run Code Online (Sandbox Code Playgroud)