junit Hamcrest对比系列

iovurdzv  于 2022-11-11  发布在  其他
关注(0)|答案(7)|浏览(116)

我尝试比较两个列表:

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)

我该怎么写?

n1bvdmb6

n1bvdmb61#

如果你想Assert这两个列表是相同的,不要用Hamcrest把事情复杂化:

assertEquals(expectedList, actual.getList());

如果您确实要执行不区分顺序的比较,可以呼叫containsInAnyOrder varargs方法并直接提供值:

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(在本例中,假设您的列表是String,而不是Agent。)
如果您真的想用List的内容调用同一个方法:

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

如果不这样做,您将使用单个参数调用该方法,并创建一个Matcher,该Matcher预期匹配一个Iterable,其中 each element 是一个List。这不能用于匹配List
也就是说,您无法将List<Agent>Matcher<Iterable<List<Agent>>匹配,而这正是您的代码所尝试的。

yyyllmsg

yyyllmsg2#

List<Long> actual = Arrays.asList(1L, 2L);
List<Long> expected = Arrays.asList(2L, 1L);
assertThat(actual, containsInAnyOrder(expected.toArray()));

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

l7wslrjt

l7wslrjt3#

补充@乔的回答:
Hamcrest为您提供了四种匹配列表的主要方法:
contains根据顺序检查是否匹配所有元素。如果列表中的元素过多或过少,则检查将失败
containsInAnyOrder检查是否匹配所有元素,顺序无关。如果列表包含更多或更少的元素,将失败
hasItems只检查指定的对象,不管列表中是否有更多的对象
hasItem只检查一个对象,不管列表中是否有多个对象
它们都可以接收一个对象列表,并使用equals方法进行比较,或者可以与其他匹配器混合使用,如前面提到的@borjab:

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")))));

(请点击这里)(请点击这里)(请点击这里)

eyh26e7m

eyh26e7m4#

对于现有的Hamcrest库(从v.2.0.0.0开始),为了使用containsInAnyOrder Matcher,你必须在你的Collection上使用Collection.toArray()方法。更好的方法是将其作为一个单独的方法添加到org.hamcrest。Matchers:

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());
}

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

yftpprvb

yftpprvb5#

对于对象列表,您可能需要类似以下内容:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.hamcrest.Matchers.is;

@Test
@SuppressWarnings("unchecked")
public void test_returnsList(){

    arrange();

    List<MyBean> myList = act();

    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")))));
}

如果您不想检查对象的顺序,请使用containsInAnyOrder。
任何帮助,以避免警告,是抑制将真正感激。

yzckvree

yzckvree6#

确保列表中的Object定义了equals()。然后

assertThat(generatedList, is(equalTo(expectedList)));

工作。

vddsk6oq

vddsk6oq7#

若要以保留的顺序(严格顺序)比较两个清单,请使用。

assertThat(actualList, contains("item1","item2"));

如果我们想在没有特定顺序的情况下进行比较,我们可以使用以下命令

assertThat(collection, containsInAnyOrder("item1","item2"));

相关问题