1

我正在学习单元测试和模拟。我有 JUnit 运行,而不是使用模拟框架,我通过扩展现有的类和接口手动创建了模拟类。我想学习模拟框架 EasyMock,因为这就是我工作中可用的所有内容。虽然您可能会建议一些其他模拟框架,但它们对我不可用。

设置:

我有一个 View 和一个 Presenter 以及一个 API 后端。当用户单击一个按钮:“检查更新”时,视图会调用presenter.checkForUpdates()执行调用api.checkForUpdates()并期望回调的 。如果发生异常,api会通过回调通知presenter,controller会调用view方法view.showUserError()。回调用于不返回参数,因为我们的 API 后端具有异步性质。

被测对象是Presenter. 具体来说,我想测试View.showUserError()在 Api 中发生异常时是否调用了该方法。我相信我可以模拟Api.checkForUpdates()立即调用异常回调,而不是进行实际的网络调用。

问题是,我只看到 EasyMock 模拟返回值。例如:

EasyMock.expect(api.checkForUpdates()).andReturn(xxxx)

不会为我工作,因为api.checkForUpdates()不返回任何东西,而是进行回调。我真正想做的是:

EasyMock.expect(api.checkForUpdates()).andExecute(exceptionCallback(NetworkError));

但我不知道该怎么做。有什么东西可以做我想做的事,还是我缺少一些基本的东西?

谢谢

4

2 回答 2

2

我认为您可以使用“Expect().andDelegateTo()”API 制作存根。

http://devlearnings.wordpress.com/2010/07/10/easymock-assert-arguments-of-method-call/

于 2012-08-03T08:41:10.030 回答
1

EasyMock 是一个不错的选择 :-) 查看文档以获取更多信息。

您可以调用 do andThrow(exceptionCallback(NetworkError) 可能适合您的需求。

如果你需要更强大的东西,andAnswer 会让你做任何你想做的事情来创建答案。andDelegateTo 也可能是一个不错的选择,但您必须实现一个实现与模拟相同接口的类。在您的情况下,这可能比其他两个选项更复杂。

于 2012-08-03T22:26:38.840 回答