Junit:断言一个列表包含至少一个与某些条件匹配的属性

时间:2018-10-08 01:15:39

标签: java unit-testing junit hamcrest

我有一个方法将返回类型为MyClass的对象的列表。 MyClass有很多属性,但是我关心typecount。我想编写一个测试,断言返回的列表至少包含一个符合特定条件的元素。例如,我要在类型"Foo"的列表中至少包含一个元素并计数1

我试图弄清楚如何做到这一点,而又不逐字逐句地遍历返回的列表并逐一检查每个元素,如果我发现可以通过的元素,就打破了,例如:

    boolean passes = false;
    for (MyClass obj:objects){
        if (obj.getName() == "Foo" && obj.getCount() == 1){
            passes = true;
        }
    }
    assertTrue(passes);

我真的不喜欢这种结构。我想知道是否有使用assertThat和一些Matcher的更好方法。

3 个答案:

答案 0 :(得分:1)

assertTrue(objects.stream().anyMatch(obj ->
    obj.getName() == "Foo" && obj.getCount() == 1
));

或更可能:

assertTrue(objects.stream().anyMatch(obj ->
    obj.getName().equals("Foo") && obj.getCount() == 1
));

答案 1 :(得分:1)

我不知道使用Hamcrest是否值得,但是很高兴知道它在那里。

public class TestClass {
    String name;
    int count;

    public TestClass(String name, int count) {
        this.name = name;
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public int getCount() {
        return count;
    }
}

@org.junit.Test
public void testApp() {
    List<TestClass> moo = new ArrayList<>();
    moo.add(new TestClass("test", 1));
    moo.add(new TestClass("test2", 2));

    MatcherAssert.assertThat(moo,
            Matchers.hasItem(Matchers.both(Matchers.<TestClass>hasProperty("name", Matchers.is("test")))
                    .and(Matchers.<TestClass>hasProperty("count", Matchers.is(1)))));
}

答案 2 :(得分:1)

有进口火腿食品

import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

您可以使用

进行测试
    assertThat(foos, hasItem(allOf(
        hasProperty("name", is("foo")),
        hasProperty("count", is(1))
    )));