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

Posted

技术标签:

【中文标题】是否可以在静态方法中 OCMock 类调用?【英文标题】:Is it possible to OCMock a class call in a static method? 【发布时间】:2012-08-22 09:58:17 【问题描述】:

我刚刚开始使用 OCMock,所以请耐心等待 - 我一直在查看文档和大量示例,但还没有找到明确的答案 - 是否可以在静态方法中模拟 init 调用,例如:

+ (NSString *)addHeaderToRequest:(NSString *)request namespace:(NSString *)namespace
        
    CTTeleInfo *netInfo = [[CTTeleInfo alloc] init];
    CTCarrier *carrier = [netInfo subscriberCell;
    NSString *mobileNetwork = [carrier carrierName];
    if ( mobileNetwork == nil )
        mobileNetwork = @"Unknown";


是否可以在不更改代码的情况下模拟 CTTeleInfo 对象?

【问题讨论】:

【参考方案1】:

这不是 OCMock 可以帮助您解决的问题。即使它可以模拟它还不能模拟的类方法,那么您仍然必须将 netInfo 对象的创建提取到模拟可以覆盖的方法中。

如果你可以更改代码,显而易见的解决方案是:

+ (NSString *)addHeaderToRequest:(NSString *)request namespace:(NSString *)namespace
   
    [self addHeaderToRequest:request namespace:namespace carrier:[[CTTeleInfo alloc] init]];


+ (NSString *)addHeaderToRequest:(NSString *)request namespace:(NSString *)namespace carrier:(CTCarrier *)carrier
 
    NSString *mobileNetwork = [carrier carrierName];
    if ( mobileNetwork == nil )
        mobileNetwork = @"Unknown";

【讨论】:

请注意,使用当前版本的 OCMock 现在可以存根类方法和创建对象的方法。不过,旧答案仍然概述了首选方法。

以上是关于是否可以在静态方法中 OCMock 类调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OCMock 验证静态方法

有关静态方法和普通方法的调用

方法的声明和调用——java

java中静态属性和和静态方法的继承问题 以及多态的实质

static静态变量

Java 静态代理