2016-04-19 6 views
0

私は、アサートに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を使わずに)、私は本当にそれを感謝します!

答えて

0

あなたは事前に、実際と予想されるリストをマッピングして、containsを使用することができます。

private void assertIfFilterItemValuesAreEqualToExpectedEnumValues(ArrayList<FilterItem> filterItems, ArrayList<MyEnum> expectedEnums) { 
    List<String> actual = filterItems.stream() 
      .map(item -> item.value) 
      .collect(toList()); 
    String[] expected = expectedEnums.stream() 
      .map(myEnum -> myEnum.getValue()) 
      .toArray(String[]::new); 

    assertThat(actual, contains(expected)); 
} 

また、これは順序が同じであることを主張します。マッピングのために新しいストリームAPIを使用しました。

0

マッチャのリストを受け入れるhamcrest メソッドを使用できます。 リストの各項目であるexpectedEnumsからマッチャーのリストを作成します。hasPropertyマッチャーとリスト内の列挙型です。

final List<Matcher<? super Object>> enumListMatcher = expectedEnums.stream() 
      .map(myEnum -> hasProperty("value", is(myEnum.getValue()))).collect(Collectors.toList()); 
    assertThat(filterItems, contains(enumListMatcher)); 

:それは限り、あなたはFilterItemvalueのgetterを持っているように動作します。

関連する問題