Junit(Let collections compare themselves)

[b]问题:[/b]
你想验证容器的内容,而你第一个想到的办法是逐个检验期望的项,是否有更简单的方法呢?

[b]背景:[/b]
如果你是一个JUnit新手,那么可能你也是一个Java新手。那么可能你不熟悉如何让对象自己进行相互比较,以至于你觉得逐个比较容器的条目是唯一的选择。其实我们更简单的办法。

[b]诀窍:[/b]
首先使用你期望的内容创建一个列表,你可以使用你期望的顺序,接着使用assertEquals()方法将其与你获取的容器(最常见的是通过一个方法)进行比较,最后就让相应的equals()方法来验证容器是否相等。

各种类型的容器的Equals方法的行为
[table]
|容器的种类|Equals()方法的行为
|List|如果两个list对象的元素全部相同,并且索引全部对应,就认为它们“相等”,而不论比较的对象是否是list接口的不同实现。比如如果一个ArrayList对象和一个LinkedList对象满足这些条件,那么就认为它们“相等”
|Set|如果两个set对象包含完全相同的元素,就认为它们“相等”,不论它们是否是Set接口的不同实现。比如,如果一个HashSet对象和一个LinkedList对象包含相同的元素,那么就认为它们是相等的。
|Map|如果两个map对象包含完全相同的关键字,并且每个关键字都映射相同的元素,就认为它们“相等”,不论它们是否是Map接口的不同实现。比如,如果一个对象HashMap对象和一个TreeMap对象满足这些条件,那么就认定它们是相等的。
|Collection|如果两个容器对象属性同一种类型(List,Set,Map),并且满足相应的类型的相等条件,才认为它们“相等”。即使一个List对象和一个Set对象包含完全相等的元素,也不认为他们是相等的。
[/table]
只要你比较的容器“属于同一种类型”,比较它们就很简单。

[b]讨论:[/b]
如果你有两个容器对象都是List类型,但你想在不考虑它们的元素顺序的前提下进行比较,那么你有几个选择,这取决于List对象的特征。如果你知道List对象没有重复项,那么可以简单地将List对象转换为Set对象再进行比较。这只需要使用assertEquals(new HashSet(expectedList), new HashSet(actualList))方法,就能够实现。

然而,如果你要比较的List对象含有重复项,你就需要首先获取每个重复项的重复次数,并确认它们是否相同。你可以创建自定义的断言方法,如果两个容器对象含有每个元素的相同数量的拷贝,那么即使它们的顺序不同,也认为它们是相等的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值