如何使用OCMockito存根类方法?
OCMockito文档声称可以模拟类对象 ,但如果我能弄清楚如何,我该死。 以下测试失败, Expected "Purple" but was ""
:
- (void)testClassMethodMocking { Class stringClassMock = mockClass([NSString class]); [given([stringClassMock string]) willReturn:@"Purple"]; assertThat([NSString string], equalTo(@"Purple")); }
如果答案是abovelinked FAQ部分“你如何模拟一个类对象?” 并不意味着它可能存在类方法的返回值,它用于什么?
编辑:
当然以上是一个简并的例子,真正的[NSString string]调用在被测试的方法中:
- (NSString *)methodThatCallsAClassMethod { return [NSString string]; }
…使上面的断言看起来像:
assertThat([testedObject methodThatCallsAClassMethod], equalTo(@"Purple"));
所以上面的内容不会有效吗? 那么我如何实现我想做的事呢?
您的断言语句直接使用NSString。 改为使用mock:
assertThat([stringClassMock string], equalTo(@"Purple"));
换句话说,模拟并没有调整实际的NSString。 相反,它是它的替身。
编辑:
在您编辑的示例中,“methodThatCallsAClassMethod”依赖于NSString。 如果要替换它,则需要注入类或Subclass和Override Method。
注射:
return [self.stringClass string];
然后,您可以将stringClass
属性设置为mock。
子类和覆盖方法:
@interface TestingFoo : Foo @end @implementation @TestingFoo - (NSString *)methodThatCallsAClassMethod { // return whatever you want } @end