首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hamcrest比较集合

Hamcrest比较集合
EN

Stack Overflow用户
提问于 2014-02-07 18:00:07
回答 6查看 142K关注 0票数 129

我试着比较两个列表:

代码语言:javascript
运行
复制
assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));

但是想法

代码语言:javascript
运行
复制
java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
  (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
  (cannot instantiate from arguments because actual and formal argument lists differ in length)

我该怎么写呢?

EN

回答 6

Stack Overflow用户

发布于 2015-03-01 11:25:48

代码语言:javascript
运行
复制
List<Long> actual = Arrays.asList(1L, 2L);
List<Long> expected = Arrays.asList(2L, 1L);
assertThat(actual, containsInAnyOrder(expected.toArray()));

@Joe答案的简短版本,没有多余的参数。

票数 74
EN

Stack Overflow用户

发布于 2017-05-18 00:40:44

为了补充@Joe的答案:

Hamcrest为您提供了三种主要方法来匹配列表:

contains检查是否匹配所有元素,如果列表中有更多或更少的元素,它将失败

containsInAnyOrder检查是否匹配所有元素,无论列表中的元素是多是少,顺序都无关紧要

hasItems只检查指定的对象,列表中是否有更多对象并不重要

hasItem只检查一个对象,列表中是否有多个对象无关紧要

它们都可以接收对象列表并使用equals方法进行比较,也可以与前面提到的@borjab等其他匹配器混合使用:

代码语言:javascript
运行
复制
assertThat(myList , contains(allOf(hasProperty("id", is(7L)), 
                                   hasProperty("name", is("testName1")),
                                   hasProperty("description", is("testDesc1"))),
                             allOf(hasProperty("id", is(11L)), 
                                   hasProperty("name", is("testName2")),
                                   hasProperty("description", is("testDesc2")))));

http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains(E...) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#containsInAnyOrder(java.util.Collection) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#hasItems(T...)

票数 36
EN

Stack Overflow用户

发布于 2016-07-08 16:57:59

对于现有的Hamcrest库(从v.2.0.0.0开始),您必须在集合上使用Collection.toArray()方法才能使用containsInAnyOrder匹配器。更好的做法是将其作为单独的方法添加到org.hamcrest.Matchers中:

代码语言:javascript
运行
复制
public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(Collection<T> items) {
    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder((T[]) items.toArray());
}

实际上,我最终将这个方法添加到我的自定义测试库中,并使用它来增加我的测试用例的可读性(由于减少了冗长)。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21624592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档