Junit: утверждает, что список содержит хотя бы одно свойство, соответствующее некоторому условию - PullRequest
0 голосов
/ 08 октября 2018

У меня есть метод, который будет возвращать список объектов типа MyClass.MyClass имеет много свойств, но я забочусь о type и count.Я хочу написать тест, который утверждает, что возвращенный список содержит по крайней мере один элемент, который соответствует определенному условию.Например, я хочу по крайней мере один элемент в списке типа "Foo" и количество 1.

Я пытаюсь выяснить, как это сделать, не буквально зацикливаясь на возвращенном списке и проверяя каждыйэлемент индивидуально, ломаясь, если я нахожу тот, который проходит, как:

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

Мне действительно не нравится эта структура.Мне интересно, есть ли лучший способ сделать это, используя assertThat и немного Matcher.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Я не знаю, стоит ли для этого использовать 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)))));
}
0 голосов
/ 08 октября 2018

с импортом подколенного сухожилия

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))
    )));
0 голосов
/ 08 октября 2018
assertTrue(objects.stream().anyMatch(obj ->
    obj.getName() == "Foo" && obj.getCount() == 1
));

Или, более вероятно:

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