如何使用OCMock验证静态方法

时间:2017-01-10 03:31:35

标签: objective-c unit-testing ocmock

我正在尝试使用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 个答案:

答案 0 :(得分:0)

这里有几件事:

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

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

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

并且忽略参数的实际值并期望它将成为NSError指针(因为您在someMethod内创建它,那里&#39在你打电话给方法之前,无法知道它会发生什么。)

其次,由于您已明确验证+isValidPropWithErrorOCMVerifyAll(partialMockUtility)无法验证任何内容。您应该明确验证您的所有期望,或者只是使用OCMVerifyAll(partialMockUtility)并让它验证您的所有期望,而不必为期望特定的电话而烦恼。 OCMVerifyAll将验证您对其提供的模拟对象所期望的一切。这不会导致测试失败 - 两次通话都会通过,因为您已经第一次验证了通话,对OCMVerifyAll()的通话不会有任何问题验证,所以它会通过。

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