ハムクレストビーンマッチャー

1概要

  • Hamcrestは開発者がより簡単な単体テストを書くのを助けるためにmatchersと呼ばれるメソッドを提供するライブラリです** たくさんのmatchersがあります、それらのうちのいくつかについて読むことから始めることができます:/java-junit-hamcrest-guide[ここ]。

この記事では、Beans Matcherを調べます。

2セットアップ

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

<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ビーンマッチャー

ビーンマッチャーはPOJOの状態をチェックするのに非常に便利です。これはほとんどのユニットテストを書くときに頻繁に必要とされるものです。

始める前に、例を通して私たちを助けるクラスを作りましょう。

public class City {
    String name;
    String state;

   //standard constructor, getters and setters

}

これで準備が整いました。次に、豆の照合機能が動作していることを確認しましょう。

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)));
}

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

3.3. getPropertyDescriptor

  • クラス構造を調べることができるようになると便利な場合があります。

@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 レベルで停止することです。

それから、Java 8の機能を使用して、取得メソッドをフィルタリングしました。

最後に、コレクションマッチャーを使用して getters リストをチェックしました。あなたは、コレクションマッチャーに関するより多くの情報リンクを見つけることができます:

4結論

Hamcrest matcherは、すべてのプロジェクトで使用されるべき優れたツールセットで構成されています。それらは習得が容易で、短期間で非常に役に立ちます。

特にBeans Matcherは、単体テストを書くときに頻繁に必要とされる、POJO上でアサーションを作成する効果的な方法を提供します。

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