【问题标题】:Is it acceptable to use Hamcrest matchers in non test code在非测试代码中使用 Hamcrest 匹配器是否可以接受
【发布时间】:2015-01-07 11:34:47
【问题描述】:
我正在尝试找到在非测试代码中使用 Hamcrest 匹配器的明确答案。我做了一些研究,并有一些对比鲜明的引用:
-
Wikipedia 上的 Hamcrest:
Hamcrest 是一个框架,它帮助编写软件测试,使用 Java 编程语言。 [snip] 这些匹配器用于单元测试框架,例如 JUnit 2 和 jMock。
-
Github 上的 Hamcrest:
Hamcrest 是一个匹配器库,可以将其组合起来以创建灵活的测试中的意图表达。
-
Google Code 上的 Hamcrest:
注意:Hamcrest 它不是一个测试库:碰巧匹配器对测试非常有用。
就我个人而言,我将 Matchers 与测试相关联,因此我倾向于避免在测试之外使用它们。尽管如此,我看不出有任何限制会阻止它们在测试范围之外使用。
这是否归结为个人喜好?
【问题讨论】:
标签:
java
unit-testing
junit
hamcrest
【解决方案1】:
到目前为止,我已经多次在非测试代码中使用 Hamcrest。大多数情况下,当我想在同一个对象上测试不同的条件以获取关于哪些条件因什么原因失败的报告时,我会使用它。然后将单个条件表示为不同的对象,这些对象也具有其他一些良好的效果。例如,检查应用程序配置可以得出结果,哪些数据支持哪些操作。
我特别将 hamcrest 用于此类任务的原因:
- 它被设计为这样做(测试条件不仅在测试代码中完成)
- 它不会带来额外的依赖关系
- 众所周知,许多人已经将它用于测试代码
- 具有易于使用的小型 API
- 易于扩展并且非常支持组合
最后归结为为工作选择合适的工具。例如 Bean 验证可以用来做相对相似的工作。而不是需要做出深思熟虑的决定,这还包含开发过程和环境的要求。
另外,使用匹配器也是采用告诉,不要问原则的好方法。您可以将匹配器传递给方法以指示您期望返回的返回值。如果有问题的对象与该匹配器不匹配,则可以立即抛出具有良好错误描述的异常。
此外,将匹配器的使用与 java 8 的 Predicate 进行比较时,匹配器的优点是能够提供描述,但缺点是它们本身不是功能接口。