11

我是 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];

这里有什么指导吗?

4

3 回答 3

17

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

[((AVCaptureSession *)[mockSession expect])  addOutput:[OCMArg any]];

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

于 2013-01-26T20:07:34.153 回答
8

好的,我想它想通了。正如我所怀疑的,这是一个简单的菜鸟错误。将 [OCMArg anyPointer] 更改为 [OCMArg any] 可以完成以下工作:

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect]  addOutput:[OCMArg any]];
于 2013-01-25T19:23:49.933 回答
0

你需要通知编译器它没问题

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-multiple-method-names"
#pragma clang diagnostic ignored "-Wstrict-selector-match"
    OCMStub([globalContextMock sharedContext]).andReturn(context);
#pragma clang diagnostic pop  
于 2021-12-10T22:51:14.053 回答