代码之家  ›  专栏  ›  技术社区  ›  coder

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

  •  1
  • coder  · 技术社区  · 16 年前

    com.example.Service service;
    
    service = RealServiceClient.getService().getServiceId("1");
    

    我怎样才能模拟上面的 RealService

    问题是 RealServiceClient.getService() 回报 .

    4 回复  |  直到 16 年前
        1
  •  1
  •   Tom Hawtin - tackline    16 年前

    那很容易。不要使用单例或其他可变静态。通过构造函数传入服务(或获取服务的方法),即“Parameterise from Above”。

        2
  •  1
  •   Chris Dail    16 年前

    为单元测试创建模拟服务有很多选项。其中的大多数名称中都有“mock”,并且都是执行此类操作的框架。以下是一些基于Java的模拟工具:

    另一个选项是修改服务本身,以允许为测试提供备用实现。尽管如此,您可能没有修改服务或接口的特权。

    就我个人而言,我更喜欢使用动态语言来进行模拟。我发现你可以得到很多你需要的能力,没有一个花哨的框架。我经常使用groovy编写单元测试。有关使用Groovy闭包而不是mock的更多信息,请参见本页: http://groovy.codehaus.org/Developer+Testing+using+Closures+instead+of+Mocks

        3
  •  1
  •   Michael Easter    16 年前

    Mockito . 太棒了。作为一个Java新手,完成教程需要一些时间,但这是非常值得努力的。

    然而,正如帕斯卡指出的, Mockito cannot mock static methods

        4
  •  0
  •   Pascal Thivent    16 年前

    如果可能的话,按照Tom Hawtin的建议使代码更易于测试。为可测试性设计代码实际上是一个很好的实践,所以这是一个好主意。一些技巧:消除静态方法(从而避免单例),提供允许注入依赖项的setter或构造函数。

    如果不是(例如,它是不能更改的遗留代码),则使用模拟框架 . 我在想 JMockit 或 Powermock (后者扩展了EasyMock和Mockito,并提供了 mock static methods ). 我最近尝试了Powermock,使用它很有乐趣。