2

OCMockito文档声称可以模拟类对象,但我该死的,如果我能弄清楚如何。以下测试失败Expected "Purple" but was ""

- (void)testClassMethodMocking
{
    Class stringClassMock = mockClass([NSString class]);
    [given([stringClassMock string]) willReturn:@"Purple"];

    assertThat([NSString string], equalTo(@"Purple"));
}

如果上面链接的常见问题解答部分的答案“你如何模拟一个类对象?” 并不意味着它可以存根类方法的返回值,它的用途什么?

编辑:

当然上面是一个退化的例子,真正的 [NSString string] 调用在被测方法内部:

- (NSString *)methodThatCallsAClassMethod
{
    return [NSString string];
}

...使上面的断言看起来像:

assertThat([testedObject methodThatCallsAClassMethod], equalTo(@"Purple"));

所以上面的完全不工作?那么,我如何在这里实现我想要做的事情呢?

4

1 回答 1

4

您的断言语句直接使用 NSString 。改用模拟:

assertThat([stringClassMock string], equalTo(@"Purple"));

换句话说,mock 并没有混合实际的 NSString。相反,它是它的替身。

编辑:

在您编辑的示例中,您的“methodThatCallsAClassMethod”依赖于 NSString。如果你想替换它,你要么需要注入类,要么需要注入子类和覆盖方法。

注射:

return [self.stringClass string];

然后您可以将stringClass属性设置为模拟。

子类和覆盖方法:

@interface TestingFoo : Foo
@end

@implementation @TestingFoo

- (NSString *)methodThatCallsAClassMethod
{
    // return whatever you want
}

@end
于 2013-11-05T21:38:49.517 回答