【问题标题】:How do I stub a class method with OCMockito?如何使用 OCMockito 存根类方法?
【发布时间】:2013-11-05 21:30:50
【问题描述】:

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"));
}

如果上面链接的常见问题解答部分的答案“你如何模拟一个类对象?” not 是否暗示可以存根类方法的返回值,它用于什么

编辑:

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

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

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

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

所以上面的方法完全行不通?那么,我该如何实现我想要在这里做的事情呢?

【问题讨论】:

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


    【解决方案1】:

    您的断言语句直接使用 NSString。改用模拟:

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

    换句话说,mock 并没有调动实际的 NSString。相反,它是它的替代品。

    编辑:

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

    注入:

    return [self.stringClass string];
    

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

    子类和覆盖方法:

    @interface TestingFoo : Foo
    @end
    
    @implementation @TestingFoo
    
    - (NSString *)methodThatCallsAClassMethod
    {
        // return whatever you want
    }
    
    @end
    

    【讨论】:

    • 我也想知道罗伯特编辑的答案。被测类使用 NSString 类方法。它没有注入。如果没有 swizzling,那么您就不可能测试被测方法,对吗?
    • @huggie 没错。如果你想捕获一些东西,你要么必须注入它,要么子类化并覆盖方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2014-01-31
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多