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"));
所以上面的内容不会有效吗?那么我如何实现我想做的事呢?
答案 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