1. 概要

Hamcrestは、ユニットテストアサーションをよりシンプルで読みやすくするためのマッチャーを提供します。利用可能なマッチャーのいくつかの探索を開始できますここ

このクイックチュートリアルでは、オブジェクトマッチャーについて詳しく説明します。

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を作成します。

最初のオブジェクトはLocationと呼ばれ、プロパティはありません。

public class Location {}

2番目のBeanにCityという名前を付け、それに次の実装を追加します。

public class City extends Location {
    
    String name;
    String state;

    // standard constructor, getters and setters

    @Override
    public String toString() {
        if (this.name == null && this.state == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        sb.append("Name: ");
        sb.append(this.name);
        sb.append(", ");
        sb.append("State: ");
        sb.append(this.state);
        sb.append("]");
        return sb.toString();
    }
}

CityLocationを拡張することに注意してください。 これは後で利用します。 それでは、オブジェクトマッチャーから始めましょう!

3.1. hasToString

名前が示すように、 hasToStringメソッドは、特定のオブジェクトに特定のStringを返すtoStringメソッドがあることを確認します。

@Test
public void givenACity_whenHasToString_thenCorrect() {
    City city = new City("San Francisco", "CA");
    
    assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}

したがって、 City を作成し、そのtoStringメソッドが必要なStringを返すことを確認しています。 これをさらに一歩進めて、同等性をチェックする代わりに、他の条件をチェックすることができます。

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

    assertThat(city, hasToString(
      equalToIgnoringCase("[NAME: SAN FRANCISCO, STATE: CA]")));
}

ご覧のとおり、 hasToStringはオーバーロードされており、パラメーターとして文字列またはテキストマッチャーの両方を受け取ることができます。 したがって、次のようなこともできます。

@Test
public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
    City city = new City(null, null);
    
    assertThat(city, hasToString(emptyOrNullString()));
}

テキストマッチャーの詳細については、ここを参照してください。 次に、次のオブジェクトマッチャーに移動しましょう。

3.2. typeCompatibleWith

このマッチャーは、is-a関係を表します。 ロケーションスーパークラスが登場します。

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

    assertThat(city.getClass(), is(typeCompatibleWith(Location.class)));
}

これは、 Cityが-Location、であり、このテストに合格する必要があることを示しています。 また、ネガティブケースをテストしたい場合:

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

    assertThat(city.getClass(), is(not(typeCompatibleWith(String.class))));
}

もちろん、私たちのクラスは弦。

最後に、すべてのJavaオブジェクトが次のテストに合格する必要があることに注意してください。

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

    assertThat(city.getClass(), is(typeCompatibleWith(Object.class)));
}

マッチャーは、アサーション全体を読みやすくするために、別のマッチャーのラッパーで構成されていることに注意してください。

4. 結論

Hamcrestは、アサーションを作成するためのシンプルでクリーンな方法を提供します。すべての開発者の生活をよりシンプルにし、すべてのプロジェクトをより読みやすくするさまざまなマッチャーがあります。

そして、オブジェクトマッチャーは間違いなくクラスのプロパティをチェックする簡単な方法です。

いつものように、完全な実装はGitHubプロジェクトにあります。