使用JUnit将Collection#unmodifiableCollection与Java中的Collection#singletonList进行比较

时间:2016-07-18 08:00:56

标签: java collections junit compare

鉴于集合:

Collection<MyObject> expected = Collections.singletonList(new MyObject);
Collection<MyObject> actual = Collections.unmodifiableCollection(new ArrayList<>(expected));

但是用

断言
assertSame(expected, actual);

我看到一个断言错误:

java.lang.AssertionError: 
expected same:<[com.flyeralarm.autopattern.algorithm.JobTransform@8807e25]>
was not: <[com.flyeralarm.autopattern.algorithm.JobTransform@8807e25]>

Expected :[com.flyeralarm.autopattern.algorithm.JobTransform@8807e25]
Actual   :[com.flyeralarm.autopattern.algorithm.JobTransform@8807e25]

但是预期和实际都向我展示了相同的hashCode。为什么测试会失败?

更新

尝试使用Assert#asserEquals运行测试后,我看到预期的是SingletonList,它绝不能等于实际的UnmodifiableCollection。因此,我有另一个问题:比较这两种类型的集合的最佳方法是什么。

2 个答案:

答案 0 :(得分:1)

比较列表的一种方法是将它们转换为数组并将其与assertArrayEquals进行比较:

assertArrayEquals(expected.toArray(), actual.toArray());

为了使其正常运行,您列表中的项目必须提供正确的equals()方法。

答案 1 :(得分:1)

根据您的馆藏内容,您可以使用Arrays.equals(...)Arrays.deepEquals(...);方法。

在单元测试中,您可以执行以下操作之一来比较它们:

  • assertThat("Custom message for failure.", Arrays.equals(expected.toArray(), actual.toArray()), is(true));

  • assertThat("Custom message for failure.", Arrays.deepEquals(expected.toArray(), actual.toArray()), is(true));

或者,您可以使用assertTrue(...);

See full JavaDocs here