1前書き

組み込みのMatcherと同様に、** HamcrestはカスタムのMatcherを作成するためのサポートも提供します。

このチュートリアルでは、それらを作成して使用する方法について詳しく説明します。利用可能なマッチャーをこっそり見てみるには、

この記事

を参照してください。


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バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22java-hamcrest%22[Maven Central]にあります。


3

TypeSafeMatcher


の紹介

例を始める前に、


TypeSafeMatcher

クラスを理解することが重要です。

** このクラスを拡張して、独自のマッチャーを作成する必要があります。


TypeSafeMatcher

は抽象クラスなので、すべてのサブクラスは次のメソッドを実装する必要があります。


  • matchesSafely(T t)

    :マッチングロジックが含まれています


  • describeTo(Description description)

    :メッセージをカスタマイズします。

私達の一致の論理が達成されないとき顧客は得る

最初のメソッドからわかるように、


TypeSafeMatcher

はパラメータ化されているので、使用するときには型を宣言する必要があります。

これがテスト対象のオブジェクトの型になります。

次のセクションの最初の例を見て、これをより明確にしましょう。


4

onlyDigits

Matcher

を作成する

最初のユースケースでは、** 特定の

String

に数字しか含まれていない場合にtrueを返すマッチャーを作成します。

したがって、「123」に適用された

onlyDigits



true

を返すはずですが、「

hello1

」と「

bye

」はfalseを返すはずです。

始めましょう!


4.1. マッチャー作成

マッチャーから始めるために、

TypeSafeMatcher

を拡張するクラスを作成します。

public class IsOnlyDigits extends TypeSafeMatcher<String> {

    @Override
    protected boolean matchesSafely(String s) {
       //...
    }

    @Override
    public void describeTo(Description description) {
       //...
    }
}

テストするオブジェクトはテキストであるため、

TypeSafeMatcher

のサブクラスをクラス

String.

でパラメータ化しています。

これで実装を追加する準備が整いました。

public class IsOnlyDigits extends TypeSafeMatcher<String> {

    @Override
    protected boolean matchesSafely(String s) {
        try {
            Integer.parseInt(s);
            return true;
        } catch (NumberFormatException nfe){
            return false;
        }
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("only digits");
    }
}

ご覧のとおり、

matchesSafey

は入力

String



Integer

に解析しようとしています。成功すれば、

true

を返します。失敗した場合は

false

を返します。それは私たちのユースケースにうまく対応しています。

一方、

describeTo

は私たちの期待を表すテキストを添付しています。マッチャーを使用すると、次にどのように表示されるかがわかります。

  • マッチャーを完成させるためにもう1つ必要なことがあります。それにアクセスするための静的メソッドです。** それは、組み込みの他のマッチャーのように振る舞います。

それで、我々はこのような何かを加えるつもりです:

public static Matcher<String> onlyDigits() {
    return new IsOnlyDigits();
}

これで終わりです。次のセクションでこのマッチャーの使い方を見てみましょう。


4.2. マッチャーの使い方

  • 私たちの新しいマッチャーを使うために、私たちはテストを作成します** :

@Test
public void givenAString__whenIsOnlyDigits__thenCorrect() {
    String digits = "1234";

    assertThat(digits, onlyDigits());
}

以上です。入力

String

に数字のみが含まれるため、このテストは成功します。もう少し読みやすくするために、他のマッチャーのラッパーとして機能するマッチャー

is

を使用できます。

assertThat(digits, is(onlyDigits()));

最後に、同じテストを「123ABC」という入力で実行した場合、出力メッセージは次のようになります。

java.lang.AssertionError:
Expected: only digits
     but: was "123ABC"

  • これが、

    describeTo

    メソッドに追加したテキストです。


5

divisibleBy


それでは、ある数が別の数で割り切れるかどうかを定義するマッチャーを作りたいとしたらどうでしょうか。そのシナリオでは、** パラメータの1つをどこかに保存する必要があります。

それができる方法を見てみましょう。

public class IsDivisibleBy extends TypeSafeMatcher<Integer> {

    private Integer divider;

   //constructors

    @Override
    protected boolean matchesSafely(Integer dividend) {
        if (divider == 0) {
            return false;
        }
        return ((dividend % divider) == 0);
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("divisible by " + divider);
    }

    public static Matcher<Integer> divisibleBy(Integer divider) {
        return new IsDivisibleBy(divider);
    }
}

簡単です、

クラスに新しい属性を追加し、それを構築時に割り当てました

それから、静的メソッドにパラメータとして渡します。

@Test
public void givenAnEvenInteger__whenDivisibleByTwo__thenCorrect() {
    Integer ten = 10;
    Integer two = 2;

    assertThat(ten,is(divisibleBy(two)));
}

@Test
public void givenAnOddInteger__whenNotDivisibleByTwo__thenCorrect() {
    Integer eleven = 11;
    Integer two = 2;

    assertThat(eleven,is(not(divisibleBy(two))));
}

以上です!我々はすでに複数の入力を使用しているマッチャーを持っています!


6. 結論

Hamcrestは、開発者がアサーションを作成するときに通常対処しなければならないほとんどのユースケースをカバーするmatcherを提供します。

さらに、特定のケースがカバーされていない場合、

Hamcrestは特定のシナリオで使用されるカスタムマッチャーの作成もサポートします

ここで説明したように


作成は簡単で、それらはライブラリに含まれているものとまったく同じように使用されます。

この例の完全な実装を得るためには、https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito[the GitHub Project]を参照してください。