1. 概要

Hamcrestは、開発者がより単純な単体テストを作成するのに役立つ、マッチャーと呼ばれるメソッドを提供するライブラリです。 マッチャーはたくさんあります、あなたはそれらのいくつかについて読むことから始めることができますここ

この記事では、Beanマッチャーについて説明します。

2. 設定

Hamcrestを取得するには、次のMaven依存関係をpom.xml追加する必要があります。

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>

最新のHamcrestバージョンは、 MavenCentralにあります。

3. Beanマッチャー

Beanマッチャーは、 POJO の状態をチェックするのに非常に役立ちます。これは、ほとんどの単体テストを作成するときに頻繁に必要になるものです。

始める前に、例を通して役立つクラスを作成します。

public class City {
    String name;
    String state;

    // standard constructor, getters and setters

}

これですべての設定が完了したので、Beanマッチャーの動作を見てみましょう。

3.1. hasProperty

このマッチャーは基本的に特定のbeanにプロパティ名で識別される特定のプロパティが含まれているかどうかをチェックします

@Test
public void givenACity_whenHasProperty_thenCorrect() {
    City city = new City("San Francisco", "CA");
    
    assertThat(city, hasProperty("state"));
}

したがって、 City beanにはstateという名前のプロパティがあるため、このテストに合格します。

このアイデアに従って、Beanに特定のプロパティがあり、そのプロパティに特定の値があるかどうかをテストすることもできます。

@Test
public void givenACity_whenHasPropertyWithValueEqualTo_thenCorrect() {
    City city = new City("San Francisco", "CA");
        
    assertThat(city, hasProperty("name", equalTo("San Francisco")));
}

ご覧のとおり、 hasPropertyはオーバーロードされており、2番目のマッチャーと一緒に使用して、プロパティの特定の条件をチェックできます。

したがって、これを行うこともできます。

@Test
public void givenACity_whenHasPropertyWithValueEqualToIgnoringCase_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city, hasProperty("state", equalToIgnoringCase("ca")));
}

便利ですよね? 次に検討するマッチャーを使用して、このアイデアをさらに一歩進めることができます。

3.2. samePropertyValuesAs

Beanの多くのプロパティをチェックする必要がある場合、目的の値を使用して新しいBeanを作成する方が簡単な場合があります。 次に、テストしたBeanと新しいBeanが等しいかどうかを確認できます。 もちろん、Hamcrestはこの状況に対応するマッチャーを提供します。

@Test
public void givenACity_whenSamePropertyValuesAs_thenCorrect() {
    City city = new City("San Francisco", "CA");
    City city2 = new City("San Francisco", "CA");

    assertThat(city, samePropertyValuesAs(city2));
}

これにより、アサーションが少なくなり、コードが単純になります。 同様に、ネガティブケースをテストできます。

@Test
public void givenACity_whenNotSamePropertyValuesAs_thenCorrect() {
    City city = new City("San Francisco", "CA");
    City city2 = new City("Los Angeles", "CA");

    assertThat(city, not(samePropertyValuesAs(city2)));
}

次に、クラスのプロパティを検査するためのいくつかのutilメソッドをよく見てください。

3.3. getPropertyDescriptor

クラス構造を探索できると便利なシナリオがあります。Hamcrestは、そうするためのいくつかのutilメソッドを提供します。

@Test
public void givenACity_whenGetPropertyDescriptor_thenCorrect() {
    City city = new City("San Francisco", "CA");
    PropertyDescriptor descriptor = getPropertyDescriptor("state", city);

    assertThat(descriptor
      .getReadMethod()
      .getName(), is(equalTo("getState")));
}

オブジェクト記述子は、プロパティの状態に関する多くの情報を取得します。この場合、ゲッターの名前を抽出し、それが何らかの期待値に等しいことを表明しました。 他のテキストマッチャーを適用することもできることに注意してください。

先に進むと、最後に検討する方法は、この同じアイデアのより一般的なケースです。

3.4. propertyDescriptorsFor

このメソッドは、基本的に前のセクションのメソッドと同じですが、beanのすべてのプロパティに対して実行されます。 また、クラス階層でどのくらいの高さにするかを指定する必要があります。

@Test
public void givenACity_whenGetPropertyDescriptorsFor_thenCorrect() {
    City city = new City("San Francisco", "CA");
    PropertyDescriptor[] descriptors = propertyDescriptorsFor(
      city, Object.class);
 
    List<String> getters = Arrays.stream(descriptors)
      .map(x -> x.getReadMethod().getName())
      .collect(toList());

    assertThat(getters, containsInAnyOrder("getName", "getState"));
}

したがって、ここで行ったことは、Bean city からすべてのプロパティ記述子を取得し、Objectレベルで停止することです。

次に、Java8の機能を使用してゲッターメソッドをフィルタリングしました。

最後に、コレクションマッチャーを使用して、gettersリストで何かをチェックしました。 コレクションマッチャーの詳細については、こちらをご覧ください。

4. 結論

Hamcrestマッチャーは、すべてのプロジェクトで使用できる優れたツールセットで構成されています。 それらは習得が容易で、短時間で非常に便利になります。

特にBeansマッチャーは、単体テストを作成するときに頻繁に必要となるPOJOを介してアサーションを作成する効果的な方法を提供します。

この例の完全な実装を取得するには、GitHubプロジェクトを参照してください。