Подтвердить что ты не робот

Hamcrest сравнить коллекции

Я пытаюсь сравнить 2 списка:

assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));

Но идея

java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
  (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
  (cannot instantiate from arguments because actual and formal argument lists differ in length)

Как мне написать?

4b9b3361

Ответ 1

Если вы хотите утверждать, что два списка идентичны, не затрудняйте работу с помощью Hamcrest:

assertEquals(expectedList, actual.getList());

Если вы действительно собираетесь выполнять нечувствительное к порядку сравнение, вы можете вызвать метод containsInAnyOrder varargs и предоставить значения напрямую:

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(Предположим, что ваш список имеет String, а не Agent, для этого примера.)

Если вы действительно хотите вызвать тот же самый метод с содержимым List:

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

Без этого вы вызываете метод с единственным аргументом и создаете Matcher, который рассчитывает соответствовать Iterable, где каждый элемент является List. Это не может использоваться для соответствия List.

То есть вы не можете сопоставить List<Agent> с Matcher<Iterable<List<Agent>>, что и делает ваш код.

Ответ 2

Единственное, что я хочу добавить в ответ @Joe, состоит в том, что параметр toArray() здесь избыточен, поэтому вы можете писать безрейтинговое сравнение следующим образом:

List<Long> actual = Arrays.asList(1L, 2L);
List<Long> expected = Arrays.asList(2L, 1L);
assertThat(actual, containsInAnyOrder(expected.toArray()));

Ответ 3

С существующими библиотеками Hamcrest (начиная с версии 2.0.0.0) вы вынуждены использовать метод Collection.toArray() в своей коллекции, чтобы использовать containsInAnyOrder Matcher. Лучше было бы добавить это как отдельный метод для org.hamcrest.Matchers:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(Collection<T> items) {
    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder((T[]) items.toArray());
}

На самом деле я включил этот метод в свою тестовую библиотеку и использовал его для повышения удобочитаемости моих тестовых случаев (из-за меньшей многословности).

Ответ 4

Чтобы добавить комментарий @Joe:

Hamcrest предоставляет вам три основных метода для соответствия списку:

contains Проверяет соответствие всех элементов при подсчете порядка, если в списке больше или меньше элементов, он будет терпеть неудачу

containsInAnyOrder Проверяет соответствие всех элементов, и не имеет значения, порядок, если список имеет более или менее элементов, не будет выполнен

hasItems Проверяет только для указанных объектов, что не имеет значения, если в списке больше

hasItem Проверяет только на один объект, не имеет значения, имеет ли список больше

Все они могут получить список объектов и использовать метод equals для сравнения или могут быть смешаны с другими подобными маркерами, такими как @borjab:

assertThat(myList , contains(allOf(hasProperty("id", is(7L)), 
                                   hasProperty("name", is("testName1")),
                                   hasProperty("description", is("testDesc1"))),
                             allOf(hasProperty("id", is(11L)), 
                                   hasProperty("name", is("testName2")),
                                   hasProperty("description", is("testDesc2")))));

http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains(E...) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#containsInAnyOrder(java.util.Collection) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#hasItems(T...)

Ответ 5

Для списка объектов вам может понадобиться примерно следующее:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.hamcrest.Matchers.is;

@Test
@SuppressWarnings("unchecked")
public void test_returnsList(){

    arrange();

    List<MyBean> myList = act();

    assertThat(myList , contains(allOf(hasProperty("id",          is(7L)), 
                                       hasProperty("name",        is("testName1")),
                                       hasProperty("description", is("testDesc1"))),
                                 allOf(hasProperty("id",          is(11L)), 
                                       hasProperty("name",        is("testName2")),
                                       hasProperty("description", is("testDesc2")))));
}

Используйте containsInAnyOrder, если вы не хотите проверять порядок объектов.

P.S. Любая помощь, чтобы избежать предупреждения, которое будет подано, будет действительно оценено.

Ответ 6

Убедитесь, что Object в вашем списке имеет equals(), определенный на них. Тогда

    assertThat(generatedList,is(equalTo(expectedList)));

работы.

Ответ 7

Чтобы сравнить два списка с сохраненным порядком,

assertThat(actualList, contains("item1","item2"));