Может ли кто-нибудь объяснить мне, как hamcrest сравнивает коллекции и для чего нужны разные методы из библиотеки?
Я пытаюсь понять, как работает метод IsIterableContainingInAnyOrder#containsInAnyOrder.
В классе IsIterableContainingInAnyOrder есть три перегруженных метода:
containsInAnyOrder(T... items)
containsInAnyOrder(Matcher<? super T>... itemMatchers)
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
Мой тестовый случай:
import org.hamcrest.Matchers;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertThat;
public class HamcrestCollections {
@Test
public void myTest(){
List<String> expected = Arrays.asList("one","two","four");
List<String> actual = Arrays.asList("two","one");
// This doesn't compile
assertThat(actual, Matchers.containsInAnyOrder(expected));
assertThat(actual, Matchers.containsInAnyOrder(expected.toArray()));
}
}
Первое утверждение не компилируется, ошибка:
Error:(19, 9) java: no suitable method found for assertThat(java.util.List<java.lang.String>,org.hamcrest.Matcher<java.lang.Iterable<? extends java.util.List<java.lang.String>>>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<? super T>) is not applicable
(cannot infer type-variable(s) T
(actual and formal argument lists differ in length))
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<? super T>) is not applicable
(inferred type does not conform to upper bound(s)
inferred: java.util.List<java.lang.String>
upper bound(s): java.lang.Iterable<? extends java.util.List<java.lang.String>>,java.lang.Object)
Я действительно не понимаю, что происходит в этом сообщении.
Я обнаружил, что для работы его нужно преобразовать в массив (второе утверждение в примере):
Matchers.containsInAnyOrder(expected.toArray()));
Я предполагаю, что в данном случае используется этот метод из библиотеки:containsInAnyOrder(T... items)
, это правда?
Но как можно использовать остальные методы из IsIterableContainingInAnyOrder
? Есть ли способ сравнить коллекции без преобразования их в массив?
assertThat()
работает отлично. В конце концов, он делегируетMatcherAssert.assertThat()
Hamcrest. Возможно, это смесь версий библиотеки hamcrest. @krokodilko Это проект maven, можешь поделиться помпоном? В качестве альтернативы вы можете поделиться версиями используемых вами библиотек и, если возможно, путем к классам среды выполнения? - person Morfic   schedule 27.02.2018