我尝试比较两个列表:
assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));
但是想法
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)
我该怎么写?
7条答案
按热度按时间n1bvdmb61#
如果你想Assert这两个列表是相同的,不要用Hamcrest把事情复杂化:
如果您确实要执行不区分顺序的比较,可以呼叫
containsInAnyOrder
varargs方法并直接提供值:(在本例中,假设您的列表是
String
,而不是Agent
。)如果您真的想用
List
的内容调用同一个方法:如果不这样做,您将使用单个参数调用该方法,并创建一个
Matcher
,该Matcher
预期匹配一个Iterable
,其中 each element 是一个List
。这不能用于匹配List
。也就是说,您无法将
List<Agent>
与Matcher<Iterable<List<Agent>>
匹配,而这正是您的代码所尝试的。yyyllmsg2#
@乔的答案的简短版本,没有多余的参数。
l7wslrjt3#
补充@乔的回答:
Hamcrest为您提供了四种匹配列表的主要方法:
contains
根据顺序检查是否匹配所有元素。如果列表中的元素过多或过少,则检查将失败containsInAnyOrder
检查是否匹配所有元素,顺序无关。如果列表包含更多或更少的元素,将失败hasItems
只检查指定的对象,不管列表中是否有更多的对象hasItem
只检查一个对象,不管列表中是否有多个对象它们都可以接收一个对象列表,并使用
equals
方法进行比较,或者可以与其他匹配器混合使用,如前面提到的@borjab:(请点击这里)(请点击这里)(请点击这里)
eyh26e7m4#
对于现有的Hamcrest库(从v.2.0.0.0开始),为了使用containsInAnyOrder Matcher,你必须在你的Collection上使用Collection.toArray()方法。更好的方法是将其作为一个单独的方法添加到org.hamcrest。Matchers:
实际上,我最终将这个方法添加到了我的自定义测试库中,并使用它来增加我的测试用例的可读性(由于不那么冗长)。
yftpprvb5#
对于对象列表,您可能需要类似以下内容:
如果您不想检查对象的顺序,请使用containsInAnyOrder。
任何帮助,以避免警告,是抑制将真正感激。
yzckvree6#
确保列表中的
Object
定义了equals()
。然后工作。
vddsk6oq7#
若要以保留的顺序(严格顺序)比较两个清单,请使用。
如果我们想在没有特定顺序的情况下进行比较,我们可以使用以下命令