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"urple"];
assertThat([NSString string], equalTo(@"urple"));
}
如果上面链接的常见问题解答部分的答案“你如何模拟一个类对象?” not 是否暗示可以 stub 类方法的返回值,它用于什么?
编辑:
当然上面是一个退化的例子,真正的[NSString string]调用在被测方法内部:
- (NSString *)methodThatCallsAClassMethod
{
return [NSString string];
}
... 使上面的断言看起来像:
assertThat([testedObject methodThatCallsAClassMethod], equalTo(@"urple"));
所以上面的方法完全行不通?那么,我该如何实现我想要在这里做的事情呢?
Best Answer-推荐答案 strong>
您的断言语句直接使用 NSString。改用模拟:
assertThat([stringClassMock string], equalTo(@"urple"));
换句话说,mock 并没有调动实际的 NSString。相反,它是它的替代品。
编辑:
在您编辑的示例中,您的“methodThatCallsAClassMethod”依赖于 NSString。如果你想替换它,你要么需要注入(inject)类,要么需要注入(inject)子类和覆盖方法。
注入(inject):
return [self.stringClass string];
然后您可以将 stringClass 属性设置为模拟。
子类和覆盖方法:
@interface TestingFoo : Foo
@end
@implementation @TestingFoo
- (NSString *)methodThatCallsAClassMethod
{
// return whatever you want
}
@end
关于ios - 如何使用 OCMockito stub 类方法?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/19799393/
|