2013-02-18 2 views
8

У меня есть список Целых (текущая) и я хочу, чтобы проверить этот список содержит ли все элементы из списка ожидаемого и даже не один элемент из списка notExpected, поэтому код выглядит следующим образом:Неправомерного Hamcrest hasItems

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

    List<Integer> notExpected = new ArrayList<Integer>(); 
    notExpected.add(3); 
    notExpected.add(4); 

    List<Integer> current = new ArrayList<Integer>(); 
    current.add(1); 
    current.add(2); 


    assertThat(current, not(hasItems(notExpected.toArray(new Integer[expected.size()])))); 

    assertThat(current, (hasItems(expected.toArray(new Integer[expected.size()])))); 

Так долго так хорошо. Но когда я добавляю

current.add(3); 

тест также зеленый. Использую ли я неправильный помощник? КПП.

for (Integer i : notExpected) 
     assertThat(current, not(hasItem(i))); 

дает мне правильный ответ, но я подумал, что просто могу легко использовать для этого совпадение hamcrest. Я использую JUnit 4.11 и Hamcrest 1.3

ответ

9

hasItems(notExpected...) будет только соответствовать current, если все элементы из notExpected также в current. Так с линией

assertThat(current, not(hasItems(notExpected...))); 

вы утверждаете, что current не содержит все элементы из notExpected.

Одно решение утверждать, что current не содержит каких-либо элементов из notExpected:

assertThat(current, everyItem(not(isIn(notExpected)))); 

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

assertThat(current, everyItem(not(isOneOf(notExpected...)))); 

Обратите внимание, что эти matchers не из CoreMatchers в hamcrest-core, так что вам нужно будет добавить зависимость от hamcrest-library.

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-library</artifactId> 
    <version>1.3</version> 
</dependency> 
Смежные вопросы