如何使用 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
内部创建它,所以在调用之前无法知道它会是什么方法)。
其次,由于您已经明确验证了+isValidPropWithError
,OCMVerifyAll(partialMockUtility)
不会验证任何内容。您应该明确地验证您的所有期望,或者简单地使用OCMVerifyAll(partialMockUtility)
并让它验证您的所有期望并且不要为期待特定的电话而烦恼。 OCMVerifyAll
将验证你对你给它的模拟对象所期望的一切。这不会导致测试失败 - 两个调用都会通过,因为您已经第一次验证了调用,对 OCMVerifyAll()
的调用不会有任何需要验证的内容,所以它会通过。
最后,OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]);
失败了,因为你没有为它设定期望。
【讨论】:
以上是关于如何使用 OCMock 验证静态方法的主要内容,如果未能解决你的问题,请参考以下文章