Как применить сопоставитель Hamcrest к свойству тестируемого класса?

Есть ли способ построить комбинированный сопоставитель 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);
    }
  }
}

person Claude    schedule 14.10.2015    source источник


Ответы (1)


Я думаю, вы ищете hasProperty или hasPropertyWithValue

См. пример здесь: https://theholyjava.wordpress.com/2011/10/15/hasproperty-the-hidden-gem-of-hamcrest-and-assertthat/

Еще один пример того, с чем я работал ранее; здесь мы проверяем, есть ли у нас метод Quote, который getModels() возвращает коллекцию PhoneModel, и один из элементов в коллекции имеет свойство makeId, равное LG_ID, и modelId, равное NEXUSmakeIdID.

            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 условности.

person Damien O'Reilly    schedule 14.10.2015