Ошибка компиляции при попытке объединить сопоставители hamcrest

У меня есть очередь строк, и я хочу объединить 2 сопоставления в одном утверждении. (Упрощенный) код выглядит примерно так

    Queue<String> strings = new LinkedList<>();
    assertThat(strings, both(hasSize(1)).and(hasItem("Some string")));

но когда я его компилирую, я получаю следующее сообщение:

incompatible types: no instance(s) of type variable(s) T exist so that org.hamcrest.Matcher<java.lang.Iterable<? super T>> conforms to org.hamcrest.Matcher<? super java.util.Collection<? extends java.lang.Object>>
  • hasItem возвращает Matcher<Iterable<? super T>>
  • hasSize возвращает Matcher<Collection<? extends E>>

как я могу это решить?


person Nir Brachel    schedule 18.07.2017    source источник


Ответы (1)


Оба сопоставителя должны соответствовать...

Matcher<? super LHS> matcher

... где LHS — это Collection<?>, потому что strings — это Collection<?>.

В вашем коде hasSize(1) - это Matcher<Collection<?>>, но hasItem("Some string") - это Matcher<Iterable<? super String>>, следовательно, ошибка компиляции.

В этом примере используется комбинируемый сопоставитель, и он является компилируемым, поскольку оба сопоставителя обращаются к коллекции...

assertThat(strings, either(empty()).or(hasSize(1)));

Но, учитывая сигнатуру метода both(), вы не можете комбинировать hasSize() и hasItem().

Комбинируемый сопоставитель — это просто короткий путь, поэтому, возможно, вы могли бы заменить его двумя утверждениями:

assertThat(strings, hasSize(1));
assertThat(strings, hasItem("Some string"));
person glytching    schedule 18.07.2017