【问题标题】:OCMock method name collisionOCMock 方法名冲突
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
    [(AVCaptureSession*)[mockSession expect]  addOutput:[OCMArg any]];
    

    【讨论】:

      【解决方案3】:

      你需要通知编译器没问题

      #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  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 2011-07-14
        • 2021-12-21
        • 2019-02-27
        相关资源
        最近更新 更多