我正在通过模拟外部服务来编写单元测试
com.example.Service service;
service = RealServiceClient.getService().getServiceId("1");
如何模拟上述RealService
类?
事情是RealServiceClient.getService()
返回RealService
。
PS:我是Java的新手。
答案 0 :(得分:1)
这很容易。不要使用单身人士或其他可变静力学。通过构造函数传递您的服务(或获取它的方式),即“从上面参数化”。
答案 1 :(得分:1)
为单元测试创建模拟服务有很多选项。其中大多数都在名称中有“模拟”,并且是用于执行此类操作的框架。以下是一些基于Java的模拟工具:
另一种选择是修改服务本身以允许提供替代实现进行测试。尽管如此,您可能无法修改服务或界面。
就个人而言,我更喜欢使用动态语言来做模拟。我发现如果没有花哨的框架,你可以获得很多你需要的能力。我使用groovy来编写单元测试。有关使用Groovy闭包而不是模拟的更多信息,请参阅此页面:http://groovy.codehaus.org/Developer+Testing+using+Closures+instead+of+Mocks
答案 2 :(得分:1)
除了其他模拟框架,我建议Mockito。太棒了。作为Java的新手,它需要一些时间来完成教程,但是值得付出努力。
然而,正如帕斯卡所指出的,Mockito cannot mock static methods。这是您提供的示例的主要限制。
答案 3 :(得分:0)
如果可能,请按照Tom Hawtin的建议使代码更易于测试。为可测试性设计代码实际上是一种很好的做法,因此这是一个好主意。一些提示:消除静态方法(从而避免单例),提供允许注入依赖项的setter或构造函数。
如果不是(例如,您无法更改它的遗留代码),请使用模拟框架允许模拟静态方法。我正在考虑JMockit或Powermock(后者扩展了EasyMock和Mockito并提供mock static methods的能力。我最近对Powermock进行了实验,并且使用它有很多乐趣。