如何确认一个可迭代包含一定的属性元素?(How do I assert an Iterable co

2019-06-17 21:57发布

假设我想单元测试与此签名的方法:

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以上版本?

Answer 1:

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


Answer 2:

尝试:

assertThat(myClass.getMyItems(),
                          hasItem(hasProperty("YourProperty", is("YourValue"))));


Answer 3:

它不是特别Hamcrest,但我认为它值得在此一提。 我在Java8经常使用的是一样的东西:

assertTrue(myClass.getMyItems().stream().anyMatch(item -> "foo".equals(item.getName())));

(编辑,以罗德里戈Manyari的轻微改善。这是一个有点更简洁。见注释)。

它可能是一个有点难以阅读,但我喜欢的类型和重构安全。 它也凉了联合测试多个bean的属性。 例如,与在过滤器中的λJava类似&&表达。



Answer 4:

Assertj擅长这个。

import static org.assertj.core.api.Assertions.assertThat;

    assertThat(myClass.getMyItems()).extracting("name").contains("foo", "bar");

对于assertj大加比hamcrest很容易使用代码完成的。



Answer 5:

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


Answer 6:

只要你的列表是一个具体的类,可以简单,只要调用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")));

假设你已经实施了接受要断言的值的构造函数。 我知道这是不是单行线,但它是有用的知道哪个值缺失,而不是一次检查两者。



文章来源: How do I assert an Iterable contains elements with a certain property?