OCMock 能否模拟一个 class 以便它自动在被测代码中使用模拟实例而不注入它

Can OCMock mock a class such that it automatically uses the mocked instance in the code under test without injecting it

我是 OCMock 的新手,有一个问题。

我们可以存根 class 的方法吗,在 class 的任何 instance/object 上调用该方法都会被嘲笑

例如:如果 Class_A 有一个非静态的 function_a 和 Class_B 有 function_b 内部声明 object_o of Class_A .

    Class_A
    {
        - function_a
    }

    Class_B
    {
        - function_b
        {
            Obj_o of Class A
            [Obj_o a];
        }
    }

现在,我想为 Class_B 编写单元测试并测试 function_b。

是否有某种机制可以让我创建 Class_A 和存根 function_b 的模拟,然后 运行 测试 function_b 并确保 function_b被绊倒了。

我知道如果我更改 function_b 的函数定义以将 object_o 作为参数发送,它就可以工作。我们创建了一个 class_A 的对象模拟,function_b 的存根,并将该对象模拟作为参数发送给 function_b,因为它获得了模拟对象的引用。但是我想检查一下在不改变函数定义的情况下测试这些函数的可行性。 OCMock是否提供这样的功能。

如果您不想更改现有的方法定义但可以接受对现有代码的更改,您可以使用这种方法:

要在 function_b 中创建 Obj_o of Class A,请在 Class_A 上使用 class 方法,例如 newInstance。除了正常的 [[Class_A] alloc] init]; 之外,此方法不需要执行任何其他操作(如果您有自定义方法,请更改为您的 init 方法)。在您的测试中,您可以将此 newInstance 函数模拟为 return 您的模拟对象的实例 Class_B.

查看 OCMock 文档,9.3 Stubbing methods that create objects

以下方法应该可行:

  • 在 class A
  • 上存根 alloc 方法
  • 在存根中创建 class A
  • 的实例
  • 仍然在存根方法中为实例创建部分模拟
  • return 来自存根方法的部分模拟

也就是说,我会建议重构您的代码以避免所有这些诡计。