Почему этот код не пытается скомпилировать Hamcrest hasItems?

Почему это не компилируется, а что делать?

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItems;

ArrayList<Integer> actual = new ArrayList<Integer>();
ArrayList<Integer> expected = new ArrayList<Integer>();
actual.add(1);
expected.add(2);
assertThat(actual, hasItems(expected));

ошибка, скопированная из комментария:

cannot find symbol method assertThat(java.util.ArrayList<java.lang.Integer>, org.hamcreset.Matcher<java.lang.Iterable<java.util.ArrayList<java.lang.Integer>>>)

Ответ 1

Просто наткнулся на это сообщение, пытаясь исправить это для себя. Дал мне достаточно информации, чтобы решить эту проблему.

Вы можете дать компилятору достаточно, чтобы убедить его скомпилировать, выставив возвращаемое значение из hasItems в (сырой) Matcher, например:

ArrayList<Integer> actual = new ArrayList<Integer>();
ArrayList<Integer> expected = new ArrayList<Integer>();
actual.add(1);
expected.add(2);
assertThat(actual, (Matcher) hasItems(expected));

На всякий случай кто-то еще страдает...

Изменить для добавления: Несмотря на все голоса, этот ответ неверен, как указывает Аренд ниже. Правильный ответ состоит в том, чтобы превратить ожидаемое в массив целых чисел, поскольку ожидается, что hamcrest:

    ArrayList<Integer> actual = new ArrayList<Integer>();
    ArrayList<Integer> expected = new ArrayList<Integer>();
    actual.add(1);
    expected.add(2);
    assertThat(actual, hasItems(expected.toArray(new Integer[expected.size()])));

Ответ 2

hasItems проверяет, что коллекция содержит некоторые элементы, а не 2 коллекции равны, просто используйте для этого обычные утверждения равенства. Таким образом, либо assertEquals (a, b), либо используя assertThat

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

ArrayList<Integer> actual = new ArrayList<Integer>();
ArrayList<Integer> expected = new ArrayList<Integer>();
actual.add(1);
expected.add(2);
assertThat(actual, is(expected));

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

import static org.junit.Assert.assertThat;
import static org.hamcrest.Matchers.contains;

ArrayList<Integer> actual = new ArrayList<Integer>();
actual.add(1);
actual.add(2);
assertThat(actual, contains(1, 2)); // passes
assertThat(actual, contains(3, 4)); // fails

Если вам не нужен порядок, используйте containsInAnyOrder.

Ответ 3

Вы сравниваете ArrayList<Integer> с int. Правильное сравнение:

...
assertThat(actual, hasItem(2));

- Изменить -

Прости, я читал это неправильно. В любом случае, подпись hasItems вы хотите:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... elements)

i.e., он принимает переменное количество аргументов. Я не уверен, совместим ли ArrayList<T>, просто угадывая здесь. Попробуйте отправить каждый элемент из ожидаемого списка, помеченного запятой.

assertThat(actual, hasItems(2,4,1,5,6));

- Изменить 2 -

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

assertTrue(actual.containsAll(expected));

Ответ 4

Try

assertThat(actual, hasItems(expected.toArray(new Integer[0])));

для удовлетворения подписи. Нет Eclipse, поэтому это может не сработать.

Ответ 5

Это сообщение об ошибке похоже на сообщение, созданное компилятором javac. Я нашел в прошлом, что код, написанный с использованием hamcrest, просто не будет компилироваться под javac. Тот же код будет компилироваться под, скажем, компилятором Eclipse.

Я думаю, что генераторы Hamcrest выполняют угловые случаи в дженериках, с которыми javac не может справиться.

Ответ 6

Я столкнулся с одной и той же проблемой, и следующий трюк работал у меня:

  • использовать import static org.hamcrest.Matchers.hasItems
  • есть библиотека hamcrest перед junit в classpath (путь сборки → порядок и экспорт)

Ответ 7

Вы можете получить эту ошибку, если попытаетесь заменить jUnit hamcrest более новой версией. Например, использование junit-dep вместе с hamcrest 1.3 требует использования assertThat из hamcrest вместо jUnit.

Таким образом, решение состоит в использовании

import static org.hamcrest.MatcherAssert.assertThat;

вместо

import static org.junit.Assert.assertThat;

Ответ 8

Для этих случаев, когда код компилируется в Eclipse, но javac показывает ошибки, пожалуйста, помогите hamcrest, указав явно тип параметра, например. Matchers.hasItem()

Ответ 9

ArrayList<Integer> expected = new ArrayList<Integer>();
expected.add(1);
expected.add(2);
hasItems(expected);

hasItems (T..t) расширяется компилятором до:

hasItems(new ArrayList<Integer>[]{expected});

Вы передаете массив элементов, содержащий ArrayList. Если вы измените ArrayList на массив, тогда ваш код будет работать.

Integer[] expected = new Integer[]{1, 2};
hasItems(expected);

Это будет расширено:

hasItems(1, 2);