Hamcrest Number Matcherを使う

1概要

  • Hamcrestは単体テストアサーションをより簡単で読みやすくするために静的なマッチャーを提供します。

この記事では、数に関連したマッチャーについて詳しく説明します。

2セットアップ

Hamcrestを取得するには、 pom.xml に次のMaven依存関係を追加するだけです。

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

最新のHamcrestバージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22java-hamcrest%22[Maven Central]で見つけることができます。

3近接マッチャー

最初に見ていくマッチャーのセットは、ある要素がある値に近いかどうかをチェックするもの、つまりエラーです。

もっと正式に:

value - error <= element <= value + error

上記の比較が正しい場合、アサーションは成功します。

実際に見てみましょう。

3.1. isClose Double の値

actualという名前のdouble変数に数値が格納されているとしましょう。そして、 actual__が1/ - 0.5に近いかどうかをテストします。

あれは:

1 - 0.5 <= actual <= 1 + 0.5
    0.5 <= actual <= 1.5

それでは、 isClose matcherを使用して単体テストを作成しましょう。

@Test
public void givenADouble__whenCloseTo__thenCorrect() {
    double actual = 1.3;
    double operand = 1;
    double error = 0.5;

    assertThat(actual, closeTo(operand, error));
}

1.3が0.5から1.5の間にあるので、テストは合格です。同様に、否定的なシナリオをテストすることができます。

@Test
public void givenADouble__whenNotCloseTo__thenCorrect() {
    double actual = 1.6;
    double operand = 1;
    double error = 0.5;

    assertThat(actual, not(closeTo(operand, error)));
}

それでは、異なる種類の変数を使用して同様の状況を見てみましょう。

3.2. isClose BigDecimal

  • isClose はオーバーロードされており、double値と同じように使用できますが、 BigDecimal オブジェクトを使用できます

@Test
public void givenABigDecimal__whenCloseTo__thenCorrect() {
    BigDecimal actual = new BigDecimal("1.0003");
    BigDecimal operand = new BigDecimal("1");
    BigDecimal error = new BigDecimal("0.0005");

    assertThat(actual, is(closeTo(operand, error)));
}

@Test
public void givenABigDecimal__whenNotCloseTo__thenCorrect() {
    BigDecimal actual = new BigDecimal("1.0006");
    BigDecimal operand = new BigDecimal("1");
    BigDecimal error = new BigDecimal("0.0005");

    assertThat(actual, is(not(closeTo(operand, error))));
}
  • is マッチャーは、追加のロジックを追加せずに他のマッチャーのみを装飾することに注意してください。アサーション全体が読みやすくなります。

それは近接マッチャーのためのそれについてです。次に、オーダーマッチャーを見てみましょう。

4オーダーマッチャー

彼らの名前が言うように、** これらのマッチャーは命令に関する主張をするのを助けます。

そのうちの5つがあります。

  • comparesEqualTo

  • __より良い

  • 以上

  • 未満

  • lessThanOrEqualTo

それらはほとんど一目瞭然ですが、いくつかの例を見てみましょう。

4.1. __Integer V __alues でMatcherを注文する

最も一般的なシナリオは、 これらのマッチャーを数字で使用することです

それでは、先に進み、いくつかのテストを作成しましょう。

@Test
public void given5__whenComparesEqualTo5__thenCorrect() {
    Integer five = 5;

    assertThat(five, comparesEqualTo(five));
}

@Test
public void given5__whenNotComparesEqualTo7__thenCorrect() {
    Integer seven = 7;
    Integer five = 5;

    assertThat(five, not(comparesEqualTo(seven)));
}

@Test
public void given7__whenGreaterThan5__thenCorrect() {
    Integer seven = 7;
    Integer five = 5;

    assertThat(seven, is(greaterThan(five)));
}

@Test
public void given7__whenGreaterThanOrEqualTo5__thenCorrect() {
    Integer seven = 7;
    Integer five = 5;

    assertThat(seven, is(greaterThanOrEqualTo(five)));
}

@Test
public void given5__whenGreaterThanOrEqualTo5__thenCorrect() {
    Integer five = 5;

    assertThat(five, is(greaterThanOrEqualTo(five)));
}

@Test
public void given3__whenLessThan5__thenCorrect() {
   Integer three = 3;
   Integer five = 5;

   assertThat(three, is(lessThan(five)));
}

@Test
public void given3__whenLessThanOrEqualTo5__thenCorrect() {
   Integer three = 3;
   Integer five = 5;

   assertThat(three, is(lessThanOrEqualTo(five)));
}

@Test
public void given5__whenLessThanOrEqualTo5__thenCorrect() {
   Integer five = 5;

   assertThat(five, is(lessThanOrEqualTo(five)));
}

理にかなっているよね?述語が何を表明しているかを理解するのがどれほど簡単であるかに注意してください。

4.2. String 値を持つオーダーマッチャー

数字を比較することは完全に理にかなっていますが、他の種類の要素を比較することは多くの場合便利です。これが、 Comparable インターフェースを実装するすべてのクラスに** 順序マッチャーを適用できる理由です。

__文字列の例をいくつか見てみましょう。

@Test
public void givenBenjamin__whenGreaterThanAmanda__thenCorrect() {
    String amanda = "Amanda";
    String benjamin = "Benjamin";

    assertThat(benjamin, is(greaterThan(amanda)));
}

@Test
public void givenAmanda__whenLessThanBenajmin__thenCorrect() {
    String amanda = "Amanda";
    String benjamin = "Benjamin";

    assertThat(amanda, is(lessThan(benjamin)));
}

String は、 Comparable インタフェースの compareTo メソッドでアルファベット順を実装しています。

したがって、「アマンダ」という単語が「ベンジャミン」という単語の前にくることは意味があります。

4.3. LocalDate 値を持つオーダーマッチャー

Strings と同じように、日付を比較できます。上記で作成したのと同じ例を見てみましょう。

@Test
public void givenToday__whenGreaterThanYesterday__thenCorrect() {
    LocalDate today = LocalDate.now();
    LocalDate yesterday = today.minusDays(1);

    assertThat(today, is(greaterThan(yesterday)));
}

@Test
public void givenToday__whenLessThanTomorrow__thenCorrect() {
    LocalDate today = LocalDate.now();
    LocalDate tomorrow = today.plusDays(1);

    assertThat(today, is(lessThan(tomorrow)));
}

assertThat(今日は(lessThan(明日))) という文が通常の英語に近いことを確認できてうれしいです。

4.4. カスタムクラスの注文マッチャー____

それでは、なぜ独自のクラスを作成して Comparableを実装しないのですか? そのようにして、 オーダーマッチャーを利用してカスタムオーダールールで使用できます

まず、 Person Beanを作成します。

public class Person {
    String name;
    int age;

   //standard constructor, getters and setters
}

それでは、 Comparable を実装しましょう。

public class Person implements Comparable<Person> {

   //...

    @Override
    public int compareTo(Person o) {
        if (this.age == o.getAge()) return 0;
        if (this.age > o.getAge()) return 1;
        else return -1;
    }
}

私たちの compareTo インプリメンテーションは彼らの年齢によって2人を比較します。それでは、新しいテストをいくつか作成しましょう。

@Test
public void givenAmanda__whenOlderThanBenjamin__thenCorrect() {
    Person amanda = new Person("Amanda", 20);
    Person benjamin = new Person("Benjamin", 18);

    assertThat(amanda, is(greaterThan(benjamin)));
}

@Test
public void
givenBenjamin__whenYoungerThanAmanda__thenCorrect() {
    Person amanda = new Person("Amanda", 20);
    Person benjamin = new Person("Benjamin", 18);

    assertThat(benjamin, is(lessThan(amanda)));
}

Matcherは現在、私たちの compareTo ロジックに基づいて動作します。

5 NaN Matcher

Hamcrestは、数字が実際に数字ではなく であるかどうかを定義するための 追加の数字マッチャーを1つ提供します。

@Test
public void givenNaN__whenIsNotANumber__thenCorrect() {
    double zero = 0d;

    assertThat(zero/zero, is(notANumber()));
}

6. 結論

ご覧のとおり、 数値マッチャーは一般的なアサーションを単純化するのに非常に役立ちます

さらに、Hamcrestの一般的なマッチャーは、 自明で読みやすい です。

これらすべてに加えて、マッチャーをカスタム比較ロジックと組み合わせる機能により、それらをそこにあるほとんどのプロジェクトにとって強力なツールにしています。

この記事の例の完全な実装は、見つけることができます。 に https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito%3C/a%3E.%3C/p%3E%0A%3Cspan%20id=