2

有没有办法构建一个组合的 Hamcrest 匹配器来测试一个对象和这个对象的属性?- 伪代码:

both(
  instanceof(MultipleFailureException.class)
).and(
  // pseudo code starts
  adapt(
    new Adapter<MultipleFailureException, Iterable<Throwable>()
    {
      public Iterable<Throwable> getAdapter(MultipleFailureException item)
      {
        return item.getFailures();
      }
    }, 
    // pseudo code ends
    everyItem(instanceOf(IllegalArgumentException.class))
  )
)

背景:我有一个 JUnit 测试,它遍历动态对象的集合。每个对象在处理时都应抛出异常。收集异常。测试应该以包含这些抛出异常的集合的 MultipleFailureException 结束:

protected final ExpectedException expectation = ExpectedException.none();
protected final ErrorCollector collector = new ErrorCollector();

@Rule
public RuleChain exceptionRules = RuleChain.outerRule(expectation).around(collector);

@Test
public void testIllegalEnumConstant()
{
  expectation.expect(/* pseudo code from above */);
  for (Object object : ILLEGAL_OBJECTS)
  {
    try
    {
      object.processWithThrow();
    }
    catch (Throwable T)
    {
      collector.addError(T);
    }
  }
}
4

1 回答 1

4

我认为您可能正在寻找hasPropertyhasPropertyWithValue

见这里的例子:https ://theholyjava.wordpress.com/2011/10/15/hasproperty-the-hidden-gem-of-hamcrest-and-assertthat/

我以前使用过的另一个例子;这里我们检查我们是否有一个Quote方法getModels()返回一个集合,PhoneModel并且集合中的一个项目具有makeId等于 LG_ID 和modelId等于 NEXUS_4_ID 的属性。

            assertThat(quote.getModels(),
                            hasItem(Matchers.<PhoneModel> hasProperty("makeId",
                                            equalTo(LG_ID))));
            assertThat(quote.getModels(),
                            hasItem(Matchers.<PhoneModel> hasProperty("modelId",
                                            equalTo(NEXUS_4_ID))));
    }

为此,hamcrest 依赖于您采用JavaBean约定。

于 2015-10-14T10:59:44.200 回答