如何使用OCMockito存根类方法?

时间:2013-11-05 21:30:51

标签: ios objective-c unit-testing mocking ocmockito

OCMockito documentation claims it's possible to mock class objects,但是如果我能弄明白的话,我该死的。以下测试失败,Expected "Purple" but was ""

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

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

如果对“abovelinked”常见问题部分“你如何模拟一个类对象?”的回答? 暗示它可能存在类方法的返回值, 用于什么?

修改

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

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

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

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

所以上面的内容不会有效吗?那么我如何实现我想做的事呢?

1 个答案:

答案 0 :(得分:4)

您的断言语句直接使用NSString。请改用mock:

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

换句话说,模拟不是在调动实际的NSString。相反,它是它的替身。

修改

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

注射:

return [self.stringClass string];

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

子类和覆盖方法:

@interface TestingFoo : Foo
@end

@implementation @TestingFoo

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

@end