从列表中断言属性

时间:2016-02-15 10:50:10

标签: java hamcrest

我有以下代码,我无法弄清楚它为什么不起作用:

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

}

MyItem:

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)

提供任何帮助或提示

3 个答案:

答案 0 :(得分:1)

我认为包含匹配列表中的所有项目,但您只断言一个项目。您需要检查这两个项目或使用另一个匹配器,例如hasItems。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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