2009-07-07 3 views
54

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

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

ответ

12

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

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

- Edit -

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

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

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

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

- Edit 2 -

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

assertTrue(actual.containsAll(expected)); 
+0

я сравниваю несколько элементов. (hasItems, not hasItem) – ripper234

+0

Итак, hamcrest просто не поддерживает сравнение двух коллекций? (У меня нет фактического списка элементов, я строю список чисел от 0 до 999, я должен сравнивать коллекции). – ripper234

+0

Я не могу ответить на это, я говорю это на основе документации. Но есть более простой способ сделать то, что вы хотите ... use assertTrue (actual.containsAll (ожидается)). – freitass

2

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

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

+0

Ничего себе, интересно. Итак, вы говорите, что приведенный выше код является законным кодом Java? – ripper234

+2

Нет, я говорю, что javac иногда отвергает законный код Java, а hamcrest - общая причина этого. – skaffman

3

Попробуйте

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

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

21

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

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

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

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

2

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

  • использование import static org.hamcrest.Matchers.hasItems
  • имеет Hamcrest библиотеки, прежде чем JUnit в пути к классам (построить путь -> заказ и экспорт)
52

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

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

Я не тестировал этот ответ, так как я давно потерял этот исходный код (дважды переехал компании), но я дал вам большой палец для воскрешения этого. – ripper234

+1

Хороший совет. Кажется, единственный «простой» способ использовать assertThat() с любым сборщиком, так как Hamcrest изменил свои обобщающие генераторы коллекции на вместо .. – Frans

+0

Я пожелал, чтобы 'hasItems' также соответствовал заказу. Кажется, что это не так. –

2

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

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

import static org.hamcrest.MatcherAssert.assertThat;

вместо

import static org.junit.Assert.assertThat;

 Смежные вопросы

  • Нет связанных вопросов^_^