静态方法如何返回不同的实现类?

时间:2010-01-11 15:12:51

标签: java oop singleton

我正在通过模拟外部服务来编写单元测试

com.example.Service service;

service = RealServiceClient.getService().getServiceId("1");

如何模拟上述RealService类?

事情是RealServiceClient.getService()返回RealService

PS:我是Java的新手。

4 个答案:

答案 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或构造函数。

如果不是(例如,您无法更改它的遗留代码),请使用模拟框架允许模拟静态方法。我正在考虑JMockitPowermock(后者扩展了EasyMock和Mockito并提供mock static methods的能力。我最近对Powermock进行了实验,并且使用它有很多乐趣。