java - matchers - spring hamcrest




Почему этот код не пытается использовать компиляцию hasItems Hamcrest? (6)

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

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>>>)

hasItems проверяет, что коллекция содержит некоторые элементы, а не две одинаковые коллекции, просто используйте для этого обычные утверждения равенства. Итак, либо 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

Если вы не заботитесь о том, чтобы использовать заказ, используйтеInAnyOrder.


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

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

import static org.hamcrest.MatcherAssert.assertThat;

вместо

import static org.junit.Assert.assertThat;


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


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

Вы можете дать компилятору достаточно, чтобы убедить его скомпилировать, выставив возвращаемое значение из 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()])));

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

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


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

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




matcher