私は、アサートにhamcrestを使用するのが非常に新しく、テストするのはかなり厄介な場合があります。hamcrestを使用して異なるカスタムオブジェクト内に値をアサートする
FilterItemとMyEnumという異なるカスタムオブジェクトのarraylistsが2つあります。両方ともプロパティを含んでいます - 'value'と言ってみましょう - これはunittestsが渡すために等しいはずです。 オブジェクトが異なるため、単純に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-loopは除外できるということです。さらに、ソリューションがforループの前の2つのアサートを不要にすることができれば、それは素晴らしいことです! おそらくhasProperty()
とが解決策の一部になる可能性がありますか?
アドバイスはありますか?
ps。現在のテストでは、リストの順序が同じかどうかは検証されませんが、それは作成したい次のユニットテストです。もし誰もがそのための素晴らしい解決策を与えることができれば(すべてのfor-loopsを使わずに)、私は本当にそれを感謝します!