Java 测试集合的顺序

Java 测试集合的顺序,java,unit-testing,junit,junit4,hamcrest,Java,Unit Testing,Junit,Junit4,Hamcrest,给定一个对象列表,我想测试它们是否以正确的顺序返回,但我不想断言整个对象 例如,我想通过 id 1, id 2, id 3, 或者在另一种情况下 date mostRecent date older date oldest enum ValueA enum ValueB enum ValueC 或者在另一种情况下 date mostRecent date older date oldest enum ValueA enum ValueB enum ValueC 基本上,我想测试我指定

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

例如,我想通过

id 1, 
id 2,
id 3,
或者在另一种情况下

date mostRecent
date older
date oldest
enum ValueA
enum ValueB
enum ValueC
或者在另一种情况下

date mostRecent
date older
date oldest
enum ValueA
enum ValueB
enum ValueC
基本上,我想测试我指定的排序是否正确,但对象上只有一个属性实际影响这一点,因此我想使用
hasFirstItem(WithPropertyQualto…hasSecondItem)的一些变体指定我的测试(WithPropertyQualto

我知道我会写作

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

但我更愿意做一些事情,使失败变得更加明显,因为这是一个排序问题,也许是声明性的,一次测试整个集合。这可能吗?

一种方法是根据给定的属性对列表进行排序,然后将排序后的列表与原始列表进行比较:

public class MyObjectIdComparator implements Comparator<MyObject> {

    @Override
    public int compare (MyObject a, MyObject b) {
        return a.getId().compareTo(b.getId());
    }
}

ArrayList<MyObject> orig = getListFromSomewhere();
ArrayList<MyObject> sorted = new ArrayList<>(orig);
Collections.sort (sorted, new MyObjectIdComparator());

assertEquals ("orig list is in the wrong order, sorted, orig);
公共类MyObjectComparator实现Comparator{
@凌驾
公共整数比较(MyObject a、MyObject b){
返回a.getId().compareTo(b.getId());
}
}
ArrayList orig=getListFromSomewhere();
ArrayList sorted=新的ArrayList(orig);
Collections.sort(已排序,新的MyObjectDComparator());
assertEquals(“原始列表顺序错误,已排序,原始”);

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

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


您能否遍历集合并报告感兴趣的属性失败的第一个案例

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));
 }
}
for(int i=0;i list.get(i+1)){
失败(String.format(“%s>%s;在索引%d的排序列表中的错误位置”,
list.get(i),list.get(i+1),i));
}
}

假设属性对象实现了可比较的接口:

Object previous = list.get(0);

for (Object element : list) {
    assertTrue(previous.getProperty().compareTo(element.getProperty()) <= 0);
    previous = element;
}
Object-previous=list.get(0);
for(对象元素:列表){

assertTrue(previous.getProperty().compareTo(element.getProperty())您应该能够像这样使用hamcrest的matcher
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"))));
    }

}
公共类Foo{
私人字符串a;
公共Foo(字符串a){
这个a=a;
}
公共对象getStr(){
返回a;
}
公共静态void main(字符串[]args){
listl=Arrays.asList(新Foo(“a”)、新Foo(“b”);
Assert.assertThat(l,包含(hasProperty(“str”),equalTo(“a”)),
hasProperty(“str”,equalTo(“b”));
}
}

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

您可以使用Java 8吗?如果可以,我可能会将属性函数映射到列表上并在结果上断言。JUnit/Hamcrests应该可以执行此操作。您甚至可以编写自己的匹配器,在您需要时执行检查Ant也许你的意思是
list.get(i)>list.get(i+1)
你不应该使用
assertNotEquals
而不是
assertEquals
来通过测试吗?@ChetanKinger按照我理解OP的方式,他有“生产能力”以某种属性排序的方式生成列表的代码。如果按该属性显式排序列表不会改变它,我们可以推断它已按预期排序-因此,在这种情况下使用
assertEquals
assertEquals
是有意义的。也就是说,我无法在P这支持你的解释。
是否包含
无序?意思是如果
新Foo(“b”)
是它仍然要传递的第一个对象吗?不,按无序顺序进行检查。contains将根据item1检查item1,等等命名…谢谢,我错误地认为contains在功能上与集合类似。contains。@Xenotratricide同意,使用
containsInOrder
contain会更有意义,也不会太混乱s
(按任何顺序)IMO