鉴于集合:
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。因此,我有另一个问题:比较这两种类型的集合的最佳方法是什么。
答案 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(...);