假设我想单元测试与此签名的方法:
List<MyItem> getMyItems();
假设MyItem
是具有许多特性,其中之一是一个POJO "name"
,经由访问getName()
我所关心的验证是, List<MyItem>
或任何Iterable
,包含两个MyItem
情况下,它的"name"
属性有值"foo"
与"bar"
。 如果任何其他属性不匹配,我真的不关心这个测试的目的。 如果名称匹配,这是一个成功的测试。
我想如果可能的话它是一个班轮。 这是什么样的事情,我想这样做的一些“伪语法”。
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
将Hamcrest有利于这种类型的事情? 如果是的话,究竟会是我的伪语法的hamcrest以上版本?
谢谢@Razvan谁在正确的方向指向我。 我能得到它在一个行,我成功地追杀的进口Hamcrest 1.3。
进口:
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
代码:
assertThat( myClass.getMyItems(), contains(
hasProperty("name", is("foo")),
hasProperty("name", is("bar"))
));
尝试:
assertThat(myClass.getMyItems(),
hasItem(hasProperty("YourProperty", is("YourValue"))));
它不是特别Hamcrest,但我认为它值得在此一提。 我在Java8经常使用的是一样的东西:
assertTrue(myClass.getMyItems().stream().anyMatch(item -> "foo".equals(item.getName())));
(编辑,以罗德里戈Manyari的轻微改善。这是一个有点更简洁。见注释)。
它可能是一个有点难以阅读,但我喜欢的类型和重构安全。 它也凉了联合测试多个bean的属性。 例如,与在过滤器中的λJava类似&&表达。
Assertj擅长这个。
import static org.assertj.core.api.Assertions.assertThat;
assertThat(myClass.getMyItems()).extracting("name").contains("foo", "bar");
对于assertj大加比hamcrest很容易使用代码完成的。
AssertJ提供了一个极好的功能extracting()
你可以通过Function
s到提取领域。 它提供了在编译时进行检查。
你也可以第1易断言大小。
它将给:
import static org.assertj.core.api.Assertions;
Assertions.assertThat(myClass.getMyItems())
.hasSize(2)
.extracting(MyItem::getName)
.containsExactlyInAnyOrder("foo", "bar");
containsExactlyInAnyOrder()
声称,该列表只包含这些值的任何命令。
断言列表包含这些值的任何顺序,但也可以包含其他值使用contains()
:
.contains("foo", "bar");
只要你的列表是一个具体的类,可以简单,只要调用contains()方法为您实现您的equals()方法上MyItem。
// given
// some input ... you to complete
// when
List<MyItems> results = service.getMyItems();
// then
assertTrue(results.contains(new MyItem("foo")));
assertTrue(results.contains(new MyItem("bar")));
假设你已经实施了接受要断言的值的构造函数。 我知道这是不是单行线,但它是有用的知道哪个值缺失,而不是一次检查两者。