Hamcrest: как использовать или / или комбинировать совпадения с коллекциями - PullRequest
0 голосов
/ 30 июня 2018

Я пишу некоторый тест класса JUnit / Aqruillian, чтобы проверить некоторые методы персистентности с Hibernate. Поэтому мне нужно получить много списков сущностей Hibernate из БД и, чтобы лучше написать свои тесты, я использую фреймворк JUnit Hamcrest. В данный момент я хотел бы использовать комбинируемые сопоставители, в частности, или / или. Я знаю, что мог бы заменить его методом anyOf(), но из-за разборчивости моего кода я бы предпочел комбинируемые сопоставления. Я не могу понять, как использовать or() метод. Вот простой пример:

@Test
public void EitherOrMatcherSimple() {
    List<String> keywords = Arrays.asList("1");
    assertThat(keywords, CombinableMatcher.either(empty()).
                                           or(nullValue()).
                                           or(both(hasItem("1")).and(hasItem("2"))));
}

Таким образом, я всегда получаю сообщение об ошибке от Eclipse, например:

The method or(Matcher<? super Collection<? extends Object>>) in the type CombinableMatcher<Collection<? extends Object>> is not applicable for the arguments (CombinableMatcher<Iterable<? super String>>)

Итак, я не понимаю, как использовать этот метод, а также то, что он ожидает в качестве аргументов. Я знаю, что .or() метод имеет Matcher<? super X> other в качестве аргумента, который для меня неясен.

Я просто знал, что / или оба / и были введены методы для лучшего написания и чтения условий Java с операторами && и ||.

Кто-нибудь, пожалуйста, объясните мне?

1 Ответ

0 голосов
/ 30 июня 2018

Иногда сложно комбинировать устройства соответствия Hamcrest по типу. Ваш пример - один из таких случаев. Может быть даже невозможно сделать это правильно без явного приведения.

Это решение для избавления от проблемы компилятора:

assertThat(
    keywords,
    CombinableMatcher.either(empty())
                     .or(nullValue())
                     .or((Matcher<? super Collection<?>>) both(hasItem("1")).and(hasItem("2")))
);

Если я правильно понимаю, проблема в слишком строгой подписи hasItem:

org.hamcrest.Matcher<java.lang.Iterable<? super T>> hasItem(T item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...