从列表中断言 属性

Assert Property from List

我有以下代码,但我不明白为什么它不起作用:

@Test
public void someTest(){

    List<MyItem> i = new ArrayList<>();
    MyItem i1 = new MyItem();
    i1.setName("paul");
    MyItem i2 = new MyItem();
    i2.setName("detlef");
    i.add(i1);
    i.add(i2);

    MatcherAssert.assertThat(i,
            Matchers.contains(
                    HasPropertyWithValue.hasProperty("name", CoreMatchers.is("paul"))));

}

我的物品:

public class MyItem {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

我找到了解决方案 here 但我的单元测试会给出 AssertionError:

java.lang.AssertionError: 
Expected: iterable containing [hasProperty("name", is "paul")]
     but: Not matched: <MyItem@4e08711f>
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
    at TestHarnes.someTest(TestHarnes.java:115)

感谢任何帮助或提示

我认为 contains 匹配列表中的所有项目,但您只声明了一项。您需要检查这两个项目或使用另一个匹配器,例如 hasItems.

恕我直言,你应该这样测试:

MatcherAssert.assertThat(ACTUAL,is(equalTo(EXPECTED)));

您可以检查列表的大小,从您想要的列表中获取对象并检查它是否等于期望数据。 isequalTo 您应该导入为静态

如果您只想断言列表中的单个项目,那么您需要 hasItem 匹配器。 contains 匹配器检查列表的所有项目。

assertThat(i, hasItem(hasProperty("name", is("paul"))));