在JUnit中超越核心Hamcrest

通过JUnit和Hamcrest改进对assertEquals的文章中我介绍了将HamcrestJUnit一起使用 。 然后,我查看了JUnit的内置Hamcrest Core Matcher支持 。 在本文中,我将介绍如何将Hamcrest的非核心匹配器与JUnit一起应用。 这些非核心匹配器默认情况下不包含在JUnit中,但可以通过在类路径中包含Hamcrest JAR来使用。
尽管JUnit包含Hamcrest核心匹配器 ,如果只想使用核心匹配器,则使它们更易于使用,但这种包含可能使非核心匹配器的使用更加困难 ,这是一个众所周知的问题
由于JUnit不包含非核心Hamcrest匹配器,因此需要下载 Hamcrest JAR。 对于本文中的示例,我正在使用hamcrest-all-1.2.jar
下一个屏幕快照显示了将所有繁琐的JAR与常规JUnit库(在本例中为NetBeans 7.2 beta提供的JUnit 4.10)组合在一起时遇到的问题。 如屏幕快照所示,在hamcrest-all-1.2.jar之前,当junit-4.10.jar包含在NetBeans库中时,先前的工作代码(来自我的 hamcrest-all-1.2.jar 文章 )会中断。 NetBeans和命令行编译器均在此屏幕快照中显示此损坏。
切换测试库的顺序,以便首先列出Hamcrest库,然后列出其后的JUnit JAR,这会使编译器中断测试代码。 这显示在下一个屏幕快照中。
尽管切换依赖库的顺序,以便在JUnit JAR确实防止构建问题之前就包含Hamcrest JAR,但这通常不是令人满意的方法。 这种方法对于长期可维护性来说太脆弱了。 幸运的是,JUnit直接支持一种更好的方法来处理此问题。
可以下载特殊的无Hamcrest的JUnit JAR。 下一个屏幕快照显示了本示例中使用的快照: junit-dep-4.10.jar 。 JAR名称中的-dep是不包含Hamcrest的线索。 下载页面上JAR旁边的符号(下图显示了屏幕快照)也指出了这一点(“无障碍的JAR”)。
借助JUnit JAR的无Hamcrest“ dep”版本,我可以在与Hamcrest JAR相关的任何时候将其包含在测试库中,并且仍然可以构建测试代码。 这比依赖于特定顺序的测试库更有利。 下一个图像显示了NetBeans的屏幕快照,并且即使首先列出了JUnit JAR,命令行构建仍然成功。
使用适当的库(JUnit-dep JAR和Hamcrest“ all” JAR)后,所有Hamcrest的匹配器都可以与基于JUnit的测试一起使用。 除了与JUnit捆绑在一起的核心匹配之外,Hamcrest还提供了许多匹配器 。 了解可用的其他匹配器的一种方法是查看Hamcrest JAR中的类。 以下是对Hamcrest JAR运行jar tvf命令并删除许多条目以留下一些最有趣的条目的输出。 “核心”匹配器倾向于基于“核心”程序包中的类,而非核心匹配器倾向于基于所有其他程序包中其名称中没有“核心”的类。
4029 Thu May 21 23:21:20 MDT 2009 org/hamcrest/core /AllOf.java
  3592 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /AnyOf.java
  1774 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /CombinableMatcher.java
  1754 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /DescribedAs.java
  1104 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /Every.java
  2088 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /Is.java
  1094 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsAnything.java
  2538 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsCollectionContaining.java
  1862 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsEqual.java
  2882 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsInstanceOf.java
  1175 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsNot.java
  1230 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsNull.java
   960 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /IsSame.java
   675 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /StringContains.java
   667 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /StringEndsWith.java
   678 Thu May 21 23:21:20 MDT 2009 org/hamcrest/ core /StringStartsWith.java
   
  2557 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsArray.java
  1805 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsArrayContaining.java
  1883 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsArrayContainingInAnyOrder.java
  1765 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsArrayContainingInOrder.java
  1388 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsArrayWithSize.java
  1296 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsCollectionWithSize.java
   812 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsEmptyCollection.java
   866 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsEmptyIterable.java
  1086 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsIn.java
  3426 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsIterableContainingInAnyOrder.java
  3479 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsIterableContainingInOrder.java
   993 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsIterableWithSize.java
  1899 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsMapContaining.java
  1493 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsMapContainingKey.java
  1421 Thu May 21 23:21:20 MDT 2009 org/hamcrest/collection/IsMapContainingValue.java

  1380 Thu May 21 23:21:20 MDT 2009 org/hamcrest/number/IsCloseTo.java
  2878 Thu May 21 23:21:20 MDT 2009 org/hamcrest/number/OrderingComparison.java

  1082 Thu May 21 23:21:20 MDT 2009 org/hamcrest/object/HasToString.java
   918 Thu May 21 23:21:20 MDT 2009 org/hamcrest/object/IsCompatibleType.java
  2080 Thu May 21 23:21:20 MDT 2009 org/hamcrest/object/IsEventFrom.java

  1164 Thu May 21 23:21:20 MDT 2009 org/hamcrest/text/IsEmptyString.java
  1389 Thu May 21 23:21:20 MDT 2009 org/hamcrest/text/IsEqualIgnoringCase.java
  2058 Thu May 21 23:21:20 MDT 2009 org/hamcrest/text/IsEqualIgnoringWhiteSpace.java
  1300 Thu May 21 23:21:20 MDT 2009 org/hamcrest/text/StringContainsInOrder.java

  4296 Thu May 21 23:21:20 MDT 2009 org/hamcrest/xml/HasXPath.java
如果希望与JUnit一起使用的Hamcrest匹配器超出“核心”匹配器,则JUnit提供的没有自动内置的Hamcrest的JAR(“ dep” JAR)使开发人员可以更仔细地构建其类路径。

参考:来自我们的JCG合作伙伴 Dustin Marx 在JUnit中超越核心Hamcrest,来自Inspired by Actual Events博客。


翻译自: https://www.javacodegeeks.com/2012/06/moving-beyond-core-hamcrest-in-junit.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值