Я новичок в использовании hamcrest для утверждений, и у меня уже есть довольно неприятный случай для тестирования.
У нас есть 2 массива различных пользовательских объектов: FilterItem и MyEnum. Оба содержат свойство, скажем, «значение», которое должно быть равным для прохождения модульных тестов. Поскольку объекты разные, я не могу просто assertThat (filterItems, hasItems(expectedEnums))
, поэтому я хотел бы утвердить содержащиеся в них значения, что значительно усложняет задачу.
В каждом юнит-тесте, где я хотел бы подтвердить это, я извлекал логику утверждения в новый метод, как показано ниже:
private void assertIfFilterItemValuesAreEqualToExpectedEnumValues(ArrayList<FilterItem> filterItems, ArrayList<MyEnum> expectedEnums)
{
ArrayList<String> filterItemValues = getFilterItemValues(filterItems);
assertEquals(expectedEnums.size(), filterItemValues.size());
// This assert prevents unittests to pass unfairly, in case the array is empty
assertFalse("No expectedEnums to assert!", expectedEnums.isEmpty());
for (MyEnum myEnum : expectedEnums)
{
String myEnumValue = myEnum.getValue();
assertThat(filterItemValues, hasItem(myEnumValue));
}
}
private ArrayList<String> getFilterItemValues(ArrayList<FilterItem> filterItems)
{
ArrayList<String> filterItemValues = new ArrayList<>();
for (FilterWaardeItem filterItem : filterItems)
{
filterItemValues.add(filterItem.value);
}
return filterItemValues;
}
Сейчас все юнит-тесты проходят, поэтому я думаю, что реализация правильная, но мне кажется, что реализация могла бы быть проще. Я чувствую, что, по крайней мере, цикл for для перечисления можно было бы исключить. Кроме того, если бы решение могло сделать 2 утверждения перед циклом for ненужными, это было бы здорово! Вероятно, hasProperty()
и contains()
могут быть частью решения?
Любой совет?
пс. текущий тест не утверждает, является ли порядок списков одинаковым, но это следующий модульный тест, который я хотел бы создать. Если бы кто-нибудь мог дать хорошее решение и для этого (без использования всех циклов for), я был бы очень признателен!