Hamcrestカスタムマッチャー

Hamcrestカスタムマッチャー

1. 前書き

組み込みのマッチャーと同様に、Hamcrest also provides support for creating custom matchers.

このチュートリアルでは、それらを作成して使用する方法を詳しく見ていきます。 利用可能なマッチャーをスニークピークするには、this articleを参照してください。

2. カスタムマッチャーのセットアップ

Hamcrestを取得するには、add the following Maven dependency to our pom.xmlを実行する必要があります。


    org.hamcrest
    java-hamcrest
    2.0.0.0
    test

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

3. TypeSafeMatcherの紹介

例を始める前に、it’s important to understand the class TypeSafeMatcher.We’ll have to extend this class to create a matcher of our own.

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

  • matchesSafely(T t):マッチングロジックが含まれています

  • describeTo(Description description):マッチングロジックが満たされない場合にクライアントが受け取るメッセージをカスタマイズします

最初のメソッドでわかるように、TypeSafeMatcher is parametrized, so we’ll have to declare a type when we use it.これがテストするオブジェクトのタイプになります。

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

4. onlyDigitsマッチャーの作成

最初のユースケースでは、we’ll create a matcher that returns true if a certain String contains only digits.

したがって、「123」に適用されたonlyDigitstrueを返し、「hello1」と「bye」はfalseを返す必要があります。

始めましょう!

4.1. マッチャーの作成

マッチャーから始めるために、TypeSafeMatcherを拡張するクラスを作成します。

public class IsOnlyDigits extends TypeSafeMatcher {

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

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

テストするオブジェクトはテキストであるため、TypeSafeMatcherのサブクラスをクラスString.でパラメーター化することに注意してください。

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

public class IsOnlyDigits extends TypeSafeMatcher {

    @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は入力StringIntegerに解析しようとしています。 成功すると、trueを返します。 失敗した場合は、falseを返します。 ユースケースに正常に応答します。

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

We only need one more thing to complete our matcher: a static method to access itであるため、残りの組み込みマッチャーとして動作します。

したがって、次のようなものを追加します。

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

これで完了です! 次のセクションで、このマッチャーの使用方法を見てみましょう。

4.2. マッチャーの使用法

use our brand new matcher, we’ll create a testへ:

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

    assertThat(digits, onlyDigits());
}

以上です。 入力Stringには数字しか含まれていないため、このテストは合格です。 もう少し読みやすくするために、we can use the matcher is that acts as a wrapper over any other matcher

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

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

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

This is where we see the text that we appended to the describeTo method.お気づきかもしれませんが、it’s important to create a proper description of what’s expected in the test.

5. divisibleBy

それで、ある数字が別の数字で割り切れるかどうかを定義するマッチャーを作成したい場合はどうでしょうか? そのシナリオでは、we’ll have to store one of the parameters somewhere.

それを行う方法を見てみましょう。

public class IsDivisibleBy extends TypeSafeMatcher {

    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 divisibleBy(Integer divider) {
        return new IsDivisibleBy(divider);
    }
}

非常に単純です、we just added a new attribute to our class and assigned it during construction。 次に、静的メソッドにパラメーターとして渡しました。

@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は、開発者がアサーションを作成するときに通常対処しなければならないほとんどのユースケースをカバーするマッチャーを提供します。

さらに、特定のケースがカバーされていない場合は、Hamcrest also gives support to create custom matchers to be used under specific scenarios –ここで説明したように.作成は簡単で、ライブラリに含まれているものとまったく同じように使用されます。

この例の完全な実装を取得するには、the GitHub Projectを参照してください。