如何使用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