测试集合的顺序

时间:2015-06-02 17:18:37

标签: java unit-testing junit junit4 hamcrest

给定一个我想测试的对象列表,它们以正确的顺序返回,但我不想断言整个对象。

例如,我想通过

验证它们是否按顺序排列
id 1, 
id 2,
id 3,

或在另一种情况下

date mostRecent
date older
date oldest

或在另一个案例中

enum ValueA
enum ValueB
enum ValueC

基本上我想测试我指定的排序是否正确,但对象上只有一个属性实际上会影响这个,所以我想用hasFirstItem( withPropertyEqualTo ... has secondItem( withPropertyEqualTo

的某个变体指定我的测试

我知道我可以写

 assertEquals( property, list.get(0).id )
 assertEquals( property, list.get(1).id )

但我宁愿做一些事情,使失败更加明显,因为它是一个排序问题,也许是声明性地,立即测试整个集合。这可能吗?

5 个答案:

答案 0 :(得分:3)

你应该能够像这样使用hamcrest的匹配器hasProperty

public class Foo {

    private String a;

    public Foo(String a) {
        this.a = a;
    }

    public Object getStr() {
        return a;
    }


    public static void main(String[] args) {
        List<Foo> l = Arrays.asList(new Foo("a"), new Foo("b"));
        Assert.assertThat(l, contains(hasProperty("str", equalTo("a")),
                                      hasProperty("str", equalTo("b"))));
    }

}

其中“str”是您要检查的属性的名称。请注意,这仅适用于名为getXxx的方法,因为它旨在测试JavaBeans。

答案 1 :(得分:2)

解决此问题的一种方法是根据给定的属性简单地对列表进行排序,然后将排序后的列表与原始列表进行比较:

header {
    background-image: url('../img/bg.png');
    height: 380px;

    input#searchBox {
        width: 100%;
        height: 70px;
    }
}

答案 2 :(得分:1)

你可以迭代收集并报告第一个感兴趣的财产失败的案例吗?

for (int i=0; i<list.size()-1; ++i) {
 if (list.get(i) > list.get(i+1)) {
    fail(String.format("%s > %s; in the wrong place in the sorted list for index %d",
        list.get(i), list.get(i+1), i));
 }
}

答案 3 :(得分:0)

您可以在assert命令中指定消息

assertEquals("Sort out of order at index " + i, expected.get(i), list.get(i));

,或者

assertSame("Sort out of order at index " + i, expected.get(i), list.get(i));

答案 4 :(得分:0)

假设属性对象实现了 Comparable 接口:

Object previous = list.get(0);

for (Object element : list) {
    assertTrue(previous.getProperty().compareTo(element.getProperty()) <= 0);
    previous = element;
}