1. 概要

この記事では、オブジェクトが特定のタイプであることを確認する方法について説明します。 さまざまなテストライブラリと、それらがオブジェクトタイプをアサートするために提供するメソッドについて見ていきます。

これを行う必要があるシナリオはさまざまです。 一般的なものは、メソッドの戻り型としてインターフェイスを利用する場合ですが、返された特定のオブジェクトに応じて、さまざまな操作を実行する必要があります。 単体テストは、返されたオブジェクトが期待するクラスを持っているかどうかを判断するのに役立ちます。

2. シナリオ例

冬に葉を失うかどうかに応じて木を並べ替えていると想像してみてください。 2つのクラスがあります。 エバーグリーン落葉性、 両方を実装しますインターフェース 。 ツリーの名前に従って正しいタイプを返す単純なソーターがあります。

Tree sortTree(String name) {

    List<String> deciduous = List.of("Beech", "Birch", "Ash", "Whitebeam", "Hornbeam", "Hazel & Willow");
    List<String> evergreen = List.of("Cedar", "Holly", "Laurel", "Olive", "Pine");

    if (deciduous.contains(name)) {
        return new Deciduous(name);
    } else if (evergreen.contains(name)) {
        return new Evergreen(name);
    } else {
        throw new RuntimeException("Tree could not be classified");
    }
}

どのタイプのツリーが実際に返されるかをテストする方法を調べてみましょう。

2.1. JUnit5でのテスト

JUnit5 を使用する場合は、assertEqualsメソッドを使用して、オブジェクトのクラスがテスト対象のクラスと等しいかどうかを確認できます。

@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
    Tree tree = tested.sortTree("Pine");
    assertEquals(tree.getClass(), Evergreen.class);
}

2.2. Hamcrestを使用したテスト

Hamcrest ライブラリを使用する場合、assertThatメソッドとinstanceOfメソッドを使用できます。

@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
Tree tree = tested.sortTree("Pine");
assertThat(tree, instanceOf(Evergreen.class));
}

org.hamcrest.Matchers.isA でインポートすると、ショートカットバージョンを利用できます。

assertThat(tree, isA(Evergreen.class));

2.3. AssertJを使用したテスト

AssertJ CoreライブラリのisExactlyInstanceOfメソッドを使用することもできます。

@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
    Tree tree = tested.sortTree("Pine");
    assertThat(tree).isExactlyInstanceOf(Evergreen.class);
}

同じテストを実行する別の方法は、hasSameClassAsメソッドを使用することです。

@Test
public void sortTreeShouldReturnDecidious_WhenBirchIsPassed() {
    Tree tree = tested.sortTree("Birch");
    assertThat(tree).hasSameClassAs(new Deciduous("Birch"));
}

3. 結論

このチュートリアルでは、単体テストでオブジェクトのタイプを検証するいくつかの異なる例を見てきました。 簡単なJunit5の例と、HamcrestおよびAssertJライブラリのメソッドを使用して示しました。 HamcrestAssertJはどちらも、エラーメッセージで追加の役立つ情報を提供します。

いつものように、この例のコードはGitHubから入手できます。