【问题标题】:Testing collection equality with ordering使用排序测试集合相等性
【发布时间】:2012-04-06 12:41:49
【问题描述】:

我正在编写简单的测试来检查方法返回Collection 下的一些接口。我试图尽可能地抽象这个集合的内部表示,以便这个测试在两种情况下都能通过:当方法返回 ListSet 时。

Set 应该被订购(LinkedHashSetLinkedHashMapbacked Set)所以我也必须测试订单。所以一般我想写这样的测试:

assertThat(returnedList, containsOrdered('t1", "t2", "t3"));

如果两个集合不“相同”(即相同顺序中的相同值),这将失败。

我发现 Hamcrest 库在这种情况下很有用,但是我被困在它的文档中。任何帮助将不胜感激,但如果可能的话,我会尽量避免编写 CollectionTestUtil 或我自己的 Hamcrest Matcher

【问题讨论】:

    标签: unit-testing testing junit junit4 hamcrest


    【解决方案1】:

    你快到了。

    assertThat(returnedList, contains("t1", "t2", "t3"))
    

    会做的。与containsInAnyOrder比较。

    【讨论】:

    • 你能提供这个包含方法的完整包和类路径吗?您是使用 JUnit 还是 Hamcrest 的 assertThat?有区别吗?
    • 我的 hamcrest 库版本错误,因为我正在拉取 hamcrest-all 依赖项。我修复了它,以及 junit 重叠问题(有 junit-dep 工件不提供 hamcrest,因此有可能添加完整的 hamcrest 支持)。感谢您的帮助
    【解决方案2】:

    JUnit 具有 org.junit.Assert,其中包含针对不同类型的多个 assertArrayEquals 实现,因此您可以执行以下操作:

        Collection<String> returnedList = new ArrayList<String>(); //Replace with call to whatever returns the ordered collection       
        Assert.assertArrayEquals(new Object[]{"t1", "t2", "t3"}, returnedList.toArray());
    

    【讨论】:

    • 是的,这是我正在考虑的替代方案(比较数组而不是集合),如果另一个失败,我会这样做。
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2018-07-26
    • 2016-06-14
    相关资源
    最近更新 更多