在非测试代码中使用Hamcrest匹配器是否可以接受

时间:2014-11-11 01:37:19

标签: java unit-testing junit hamcrest

我试图找到在非测试代码中使用Hamcrest匹配器的明确答案。我做了一些研究,并有一些对比的引用:

  • Wikipedia上的Hamcrest:

      
        

    Hamcrest是一个框架,帮助编写Java编程语言中的软件测试。 [snip]这些匹配器在单元测试框架中有用,例如JUnit 2和jMock。

      
  • Github上的Hamcrest:

      
        

    Hamcrest是一个匹配器库,可以结合使用以在测试中创建灵活的意图表达

      
  • Google Code上的Hamcrest:

      
        

    注意: Hamcrest它不是测试库:只是匹配器对测试非常有用。

      

就个人而言,我将Matchers与测试联系起来,所以我倾向于避免在测试之外使用它们。尽管如此,我认为没有任何限制可以阻止它们在测试范围之外使用。

这是否归结为个人偏好?

2 个答案:

答案 0 :(得分:6)

到目前为止,我已经多次在非测试代码中使用过Hamcrest。当我想在同一个对象上测试不同的条件时,我会使用它来获取由于什么原因导致哪些条件失败的报告。然后将单个条件表示为不同的对象,这些对象也具有一些其他好的效果。例如,检查应用程序配置可以产生哪些操作支持数据的结果。

我特别使用hamcrest进行此类任务的原因:

  • 它的目的是为了做到这一点(测试条件不只是在测试代码中完成)
  • 它不会带来额外的依赖性
  • 众所周知,许多人已将其用于测试代码
  • 有一个易于使用的小API
  • 易于扩展并且非常好地支持组合

最后归结为选择合适的工具。例如,Bean验证可用于执行相对类似的工作。需要做出深思熟虑的决定,这也包含了开发过程和环境的要求。

同样使用匹配器是使用 Tell,do not Ask 原则的好方法。您可以将匹配器传递给方法,以指示您希望返回的返回值。如果有问题的对象与该匹配器不匹配,则可以立即抛出具有良好错误描述的异常。

此外,在将匹配器的使用与java 8的Predicate进行比较时,匹配器的好处是能够提供描述,但缺点是它们本身不是功能接口。

答案 1 :(得分:3)

它可以用于非测试代码。例如。 LambdaJ库支持Hamcrest匹配器:https://code.google.com/p/lambdaj/wiki/LambdajFeatures