如何使用 OCMock 验证静态方法

Posted

技术标签:

【中文标题】如何使用 OCMock 验证静态方法【英文标题】:How to use OCMock to verify static methods 【发布时间】:2017-01-10 03:31:35 【问题描述】:

我正在尝试使用 OCMock 库。我正在尝试创建类对象的模拟,但无法验证该方法。我无法理解测试失败的原因。

@interface MyClass:NSObject
+(void) someMethod;
@end
@implementation MyClass
+(void) someMethod


    NSError* error = nil;
    if (![Utility isValidPropWithError:&error])
    
        [Logger log:LoggerLevelWarning message:[error localizedDescription] className:className];
    

@end

测试:

-(void)testIfLoggerIsset
    id partialMockLogger = OCMClassMock([Logger class]);
    id partialMockUtility = OCMClassMock([Utility class]);
    id partialMockClass = OCMClassMock([MyClass class]);
    NSError *error = nil;
    OCMExpect([partialMockUtility isValidPropWithError:&error]);

    [MyClass someMethod];

    //This works fine.
    OCMVerifyAll(partialMockClass);
    NSString *className = @"classname";
    //This is failing...
    OCMVerify([partialMockUtility isValidPropWithError:&error]);
    OCMVerifyAll(partialMockUtility);
    //This is failing...
    OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]);
    [partialMockUtility stopMocking];
    [partialMockLogger stopMocking];

在上面的代码中,虽然[Utility isValidPropWithError:&error];被称为OCMVerify([partialMockUtility isValidPropWithError:&error]);是失败的。

【问题讨论】:

【参考方案1】:

这里有几件事:

首先,OCMVerify([partialMockUtility isValidPropWithError:&error] 失败了,因为您希望将您在测试中创建的NSError 对象的地址传递给isValidPropWithError:,但在MyClass +someMethod 中您正在创建不同 NSError 对象。两个不同对象的地址不会相同。

要解决此问题,请将您的期望和验证更改为:

OCMExpect([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg anyPointer]]);
OCMVerify([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg 

忽略参数的实际值并期望它是一个NSError 指针(因为您是在someMethod 内部创建它,所以在调用之前无法知道它会是什么方法)。

其次,由于您已经明确验证了+isValidPropWithErrorOCMVerifyAll(partialMockUtility) 不会验证任何内容。您应该明确地验证您的所有期望,或者简单地使用OCMVerifyAll(partialMockUtility) 并让它验证您的所有期望并且不要为期待特定的电话而烦恼。 OCMVerifyAll 将验证你对你给它的模拟对象所期望的一切。这不会导致测试失败 - 两个调用都会通过,因为您已经第一次验证了调用,对 OCMVerifyAll() 的调用不会有任何需要验证的内容,所以它会通过。

最后,OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]); 失败了,因为你没有为它设定期望。

【讨论】:

以上是关于如何使用 OCMock 验证静态方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用OCMock验证在Objective C中不调用异步方法?

如何使用 OCMock 测试类方法

如何使用 ocmock 在基于类的方法上存根返回值

如何使用 OCMock 3 在单元测试中检查函数的返回值

是否可以在静态方法中 OCMock 类调用?

void 方法的 OCMock 测试