2015-06-02 4 views
3

Учитывая список объектов, которые я хотел бы проверить, чтобы они вернулись в правильном порядке, но я бы не хотел утверждать весь объект.проверка порядка коллекции

Например, я хотел бы, чтобы убедиться, что они в порядке

id 1, 
id 2, 
id 3, 

или в другом случае

date mostRecent 
date older 
date oldest 

или в еще одном случае

enum ValueA 
enum ValueB 
enum ValueC 

в основном Я хочу проверить, что сортировка, указанная мной, прошла правильно, но только одно свойство на объекте действительно влияет s, поэтому я хотел бы указать мой тест с некоторым вариантом hasFirstItem(withPropertyEqualTo ... has secondItem(withPropertyEqualTo

Я знаю, что могу написать

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

, но я предпочел бы сделать что-то, что делает отказ немного более очевидным, чтобы будучи проблемой сортировки и, возможно, декларативно, одновременно проверяя всю коллекцию. Это возможно?

+1

Можете ли вы использовать Java 8? Если это так, я могу сопоставить функцию свойства над списком и утвердить результат. –

+0

JUnit/Hamcrests ['assertThat (актуально, содержит (item1, item2, ...));] (http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains%28E ...% 29) должен сделать это. Вы даже можете написать собственные Матчи, которые делают чек, как вы хотите –

ответ

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")))); 
    } 

} 

где "ул" это имя имущества, которое вы хотите проверить. Обратите внимание, что это работает только для методов с именем getXxx, поскольку оно предназначено для тестирования JavaBeans.

+0

не 'содержит' неупорядочен? Означает, что если' new Foo ("b") '- первый объект, который он все равно пройдет? – xenoterracide

+2

Нет, [containsInAnyOrder] (http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#containsInAnyOrder%28java.util.Collection%29) проверяет неразумные мудрые. содержит проверит item1 на item1 и т. д. –

+0

Именование ... спасибо, я предположил, что неправильно, что содержит, был похож на функцию Collection.contains. – xenoterracide

2

Один из способов идти об этом было бы просто отсортировать список по данному свойству, а затем сравнить отсортированный список на оригинал:

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); 
+0

Разве вы не используете 'assertNotEquals' вместо' assertEquals' для прохождения теста? – CKing

+0

@ChetanKinger Как я понимаю OP, у него есть «производственный» код, который генерирует список так, как это упорядочено каким-то свойством. Если явная сортировка списка по этому свойству делает ** не ** изменить его, мы можем сделать вывод, что он уже был отсортирован, как и ожидалось, - следовательно, использование 'assertEquals'. – Mureinik

+0

'assertEquals' имел бы смысл в этом случае.При этом я не могу найти достаточное количество контента в OP, который поддерживает ваше объяснение. – CKing

0

Вы можете указать сообщение в вашей команде утверждают,

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)); 
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)); 
} 
} 
+0

Возможно, вы имели в виду 'list.get (i)> list.get (i + 1)' –

+0

Oops; правильно. Я исправлю это. –

0

Предполагая, что объект недвижимости реализует Comparable интерфейса:

Object previous = list.get(0); 

for (Object element : list) { 
    assertTrue(previous.getProperty().compareTo(element.getProperty()) <= 0); 
    previous = element; 
} 
Смежные вопросы