OCMock可以模拟一个类,使其在测试代码中自动使用模拟实例而不注入它

时间:2017-05-04 12:42:13

标签: ios objective-c unit-testing stub ocmock

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

我们可以存根一个类的方法,其中通过该类的任何实例/对象调用该方法被模拟

例如:如果Class_A具有非静态function_a而Class_B具有function_b,其在内部声明了Class_A的object_o。

    Class_A
    {
        - function_a
    }

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

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

是否有一些机制可以创建Class_A和stub function_b的模拟,然后运行test function_b并确保function_b被存根。

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

2 个答案:

答案 0 :(得分:2)

如果您不想更改现有方法定义但可以更改现有代码,则可以使用此方法:

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

请参阅OCMock的文档,9.3 Stubbing methods that create objects

答案 1 :(得分:1)

应该可以采用以下方法:

  • 在类 A
  • 上存根alloc方法 存根中的
  • 创建类 A
  • 的实例
  • 仍然在stubbed方法中为实例创建部分模拟
  • 从存根方法
  • 返回部分模拟

那就是说,我建议重新构建你的代码以避免所有这些诡计。

相关问题