Junit:断言一个列表至少包含一个 属性 匹配某个条件
Junit: assert that a list contains at least one property that matches some condition
我有一个方法可以 return 类型为 MyClass
的对象列表。 MyClass
有很多属性,但我比较关心type
和count
。我想编写一个测试来断言 returned 列表至少包含一个与特定条件匹配的元素。例如,我希望列表中至少有一个元素类型为 "Foo"
且数量为 1
.
我正在尝试弄清楚如何做到这一点,而不是直接遍历 returned 列表并单独检查每个元素,如果我找到一个通过的元素就会中断,比如:
boolean passes = false;
for (MyClass obj:objects){
if (obj.getName() == "Foo" && obj.getCount() == 1){
passes = true;
}
}
assertTrue(passes);
我真的不喜欢这种结构。我想知道使用 assertThat
和一些 Matcher 是否有更好的方法。
assertTrue(objects.stream().anyMatch(obj ->
obj.getName() == "Foo" && obj.getCount() == 1
));
或更有可能:
assertTrue(objects.stream().anyMatch(obj ->
obj.getName().equals("Foo") && obj.getCount() == 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)))));
}
使用 hamcrest 进口
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))
)));
我有一个方法可以 return 类型为 MyClass
的对象列表。 MyClass
有很多属性,但我比较关心type
和count
。我想编写一个测试来断言 returned 列表至少包含一个与特定条件匹配的元素。例如,我希望列表中至少有一个元素类型为 "Foo"
且数量为 1
.
我正在尝试弄清楚如何做到这一点,而不是直接遍历 returned 列表并单独检查每个元素,如果我找到一个通过的元素就会中断,比如:
boolean passes = false;
for (MyClass obj:objects){
if (obj.getName() == "Foo" && obj.getCount() == 1){
passes = true;
}
}
assertTrue(passes);
我真的不喜欢这种结构。我想知道使用 assertThat
和一些 Matcher 是否有更好的方法。
assertTrue(objects.stream().anyMatch(obj ->
obj.getName() == "Foo" && obj.getCount() == 1
));
或更有可能:
assertTrue(objects.stream().anyMatch(obj ->
obj.getName().equals("Foo") && obj.getCount() == 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)))));
}
使用 hamcrest 进口
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))
)));