模拟另一个类方法的内部调用

Posted

技术标签:

【中文标题】模拟另一个类方法的内部调用【英文标题】:Mock internal calls of a another class methods 【发布时间】:2014-08-20 09:18:14 【问题描述】:

我正在尝试使用 ocmock 学习单元测试。我发现很难从我正在单元测试的类中模拟另一个类的调用。

有人可以建议如何模拟调用 KeyChainUtils 类和 HttpRequest 类:

使用 OCMock 进行单元测试的代码:

@implementation UserProfileService 
+(BOOL) isValidUser

    NSString* userId = [KeyChainUtil loadValueForKey:USER_ID]; //mock this call
    bool isValidUser = NO;
    if(userId && userId.length > 0)
        NSDictionary* response = [HTTPDataService getJSONForURL:@"http://xtest.com/checkuserid" forRequestData:@@"userid": userId];

        if(response && response[@"valid"])
            isValidUser = [response[@"valid"] boolValue];             
        else
            NSLog(@"error in connecting to server. response => %@", response);
        
    
    return isValidUser;
 

【问题讨论】:

【参考方案1】:

从 OCMock 2.1 版开始,我们可以存根类方法。更多信息请参考此链接:http://www.ocmock.org/features/

所以,我们可以像这样对类方法存根:

id keyChainUtilMock = [OCMockObject mockForClass:[KeyChainUtil class]];
[[[keyChainUtilMock stub] andReturn:@"aasdf"] loadValueForKey:USER_ID];

NSString* userId = [KeyChainUtil loadValueForKey:USER_ID];
NSLog(@" stubbed value-->%@", userId);

所以,在运行这段特定的代码之后。这里不调用实际的类方法,而是返回存根值。希望对您有所帮助。

【讨论】:

以上是关于模拟另一个类方法的内部调用的主要内容,如果未能解决你的问题,请参考以下文章

从具有相同基的另一个派生类调用派生类的非常量方法

java 中 如何将“一个类的方法 ”作为参数传到“另一个类的方法”中

内部类专题(自学)

Java内部类与异常类

测试扩展另一个类的抽象类

请问JAVA中匿名内部类有啥用,举个例子,谢谢