使用 OCMockito 模拟无效的方法

Posted

技术标签:

【中文标题】使用 OCMockito 模拟无效的方法【英文标题】:Using OCMockito to mock methods that are void 【发布时间】:2015-03-13 22:45:31 【问题描述】:

在使用 OCMockito 时,以下效果很好:

DSAPIManager *mockAPIManager = mock([DSAPIManager class]);
[given([mockAPIManager initWithBaseURL:[mockAPIManager baseURL]]) willReturn:[DSAPIManager sharedAPIManager]];

但是,当我在具有多个参数的方法上尝试相同的操作时(请参见下面的代码),我收到“参数类型 'void' 不完整”编译器错误。

DSAPIManager *mockAPIManager = mock([DSAPIManager class]);
[given([mockAPIManager setLoginCredentialsWithEmail:@""
                                           password:@""]) willReturn:@""];

有人知道正确的方法吗?

编辑

我提出这个问题的初衷是解决在尝试以下操作时出现编译器错误的问题:

[given([mockAPIManager setLoginCredentialsWithEmail:@"" password:@""]) willDo:^id(NSInvocation *invocation) 
        // Mock implementation goes here
];

我要模拟的方法的方法签名是:

- (void)setLoginCredentialsWithEmail:(NSString *)email password:(NSString *)password;

我实际上想要做的是模拟void 方法的实现。 (给定一个void 方法,用块模拟该方法的实现。出于我的目的,该方法返回一个完成块,它接受两个参数。我想构造这两个参数,然后在里面运行完成块模拟出来的实现块。)

【问题讨论】:

你在哪一行创建mockAPIManager @JonReid 在上面的代码中添加了这一行。 谢谢。第二种方法的返回类型是什么? 对不起@JonReid 我意识到我问错了问题。我用我的具体用例编辑了上面的内容。基本问题是我可以使用 OCMockito 来模拟 void 有一些副作用的方法。谢谢。 【参考方案1】:

现在你可以像这样使用 givenVoid

[givenVoid([mockAPIManager setLoginCredentialsWithEmail:@"" password:@""]) willDo:^id(NSInvocation *invocation) 
        // Mock implementation goes here
];

【讨论】:

【参考方案2】:

OCMockito 还不支持 void 方法的存根。那是因为在willThrow:willDo: 出现之前,没有必要。它将很快作为一项功能添加。您可以在https://github.com/jonreid/OCMockito/pull/93跟踪进度

【讨论】:

以上是关于使用 OCMockito 模拟无效的方法的主要内容,如果未能解决你的问题,请参考以下文章

一些涉及块方法和 OCMockito 的验证

使用 OCMockito 验证方法调用

如何在 Kiwi 中为模拟方法设置参数期望

用于 PC Mockito 模拟验证的自定义 Hamcrest 匹配器

OCMockito / OCHamcrest 验证数组包含对象属性

Mock单元测试