JUnit 5 の Fail メソッドのタイプを暗黙的に推測する

David Mbochi Njonge 2023年6月20日
  1. Kotlin プロジェクトを作成して依存関係を追加する
  2. 型変数 V を推測するのに十分な情報がありません
  3. fail() メソッドの型を明示的に推測する
  4. ラムダ式で fail() メソッドを使用する
  5. fail() メソッドの型を暗黙的に推測する
  6. まとめ
JUnit 5 の Fail メソッドのタイプを暗黙的に推測する

テストは、開発段階の早い段階でバグを検出し、アプリケーションのパフォーマンスを向上させ、開発コストを削減するのに役立つため、アプリケーションの開発において重要なステップです。

テストがアプリケーションの重要なプロセスであるとします。 その場合は、テスト駆動開発 (TDD) アプローチを使用することをお勧めします。これは、テストに失敗した機能の実装を開始し、その後に最終的にテストに合格する実際のコードが続きます。

アプリケーションでは、単体テスト、統合テスト、機能テストなど、さまざまな種類のテストを実行できます。 このチュートリアルでは、JUnit 5 を使用した単体テスト段階で使用される fail() メソッドの型を暗黙的に推測する方法を説明します。

Kotlin プロジェクトを作成して依存関係を追加する

IntelliJ 開発環境を開き、File > New > Project を選択します。 開いたウィンドウで、プロジェクトの名前kotlin-testingと入力し、言語セクションでKotlinを選択し、ビルド システムセクションでGradleを選択します。

Create ボタンを押してプロジェクトを生成します。

build.gradle ファイルを開き、以下に示すように junit-jupiter-api 依存関係があることを確認します。 この依存関係により、コードのテストに使用する API が提供されます。

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
    testImplementation 'org.jetbrains.kotlin:kotlin-test'
}

src/main/kotlin フォルダーの下に Main.kt ファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

class Student(
    var id: Int,
    var studentName: String?,
    var studentIDCard: String?){

    override fun toString(): String {
        return "student name: $studentName, ID card: $studentIDCard"
    }
}

fun getStudents(): List<Student>{
    return listOf(
        Student(1,"john doe","CSO12022"),
        Student(2,"mary public","CS022022"),
        Student(3,"elon mask","S032022")
    );
}

上記のコードでは、student オブジェクトを含むリストを作成しました。このリストを使用してテストを行います。

型変数 V を推測するのに十分な情報がありません

src/test/kotlin フォルダーの下に Main.kt ファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.fail

class TestStudents{
    private val students: List<Student> = getStudents();

     @Test
    fun checkEmptyClass(){
        if (students.isNotEmpty()){
            fail("The class is not empty")
        }
    }

}

このコードでは、前のセクションで作成したリストを使用して空かどうかをチェックする checkEmptyClass() という名前のテストを作成しました。 リストが空でない場合、fail() メソッドを呼び出し、メソッドの引数としてエラー メッセージを渡します。

Assertions クラスの静的メソッド fail() を使用していることに注意してください。 クラスの完全修飾名は org.junit.jupiter.api.Assertions です。

このクラスの fail() メソッドを使用すると、コンパイラは、メソッドがジェネリックであり、型パラメーターを提供していないため、型変数 V を推測するのに十分な情報がありません というメッセージを含む警告を表示します。

fail() メソッドの型を明示的に推測する

最初に頭に浮かぶ最も簡単な方法は、次のコードに示すように、型パラメーターを明示的に指定してコンパイラーを調整することです。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.fail

class TestStudents{
    private val students: List<Student> = getStudents();

      @Test
    fun checkEmptyClass(){
        if (students.isNotEmpty()){
            fail<String>("The class is not empty")
        }
    }

}

コンパイラをなだめるためにステートメントを使用した理由は、return ステートメントに到達する前に例外 org.opentest4j.AssertionFailedError がスローされるため、型が返されないことに注意してください。

簡単に言えば、コードでは役に立たない汎用パラメーターを提供します。 次のセクションでは、ジェネリック パラメータを明示的に指定せずにこのメソッドを呼び出す方法を示します。

このテストを実行し、次のメッセージで失敗することを確認します。

The class is not empty
org.opentest4j.AssertionFailedError: The class is not empty

ラムダ式で fail() メソッドを使用する

上記の例についてコメントし、次のコードをコピーして、src/test/kotlin フォルダーの下の Main.kt ファイルに貼り付けます。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.fail

class TestStudents{
    private val students: List<Student> = getStudents();

    @Test
    fun findInvalidStudentIDCard(){
       students.forEach { student: Student ->
           if (student.studentIDCard?.startsWith("CS") == true){
               println(student)
           }else{
               fail("$student has an invalid id");
           }
       }
    }

}

この例では、student リストを反復処理し、有効なカード番号で学生をログに記録し、カード番号が無効な場合は fail() メソッドを呼び出す findInvalidStudentIDCard() という名前のテストを作成しました。

1つのパラメーターを受け取り、値を返さない forEach() メソッドを使用しました。 これは通常、消費者と呼ばれます。

ラムダ式を扱う場合、コンパイラはメソッドに渡された Consumer から型を推測できるため、型を明示的に推測する必要はありません。

このコードでは、コンパイラはコンパイル時エラーを表示しません。 このテストを実行し、出力が次のようになっていることを確認します。

student name: john doe, ID card: CSO12022
student name: mary public, ID card: CS022022

student name: elon mask, ID card: S032022 has an invalid id
org.opentest4j.AssertionFailedError: student name: elon mask, ID card: S032022 has an invalid id

fail() メソッドの型を暗黙的に推測する

上記の例についてコメントし、次のコードをコピーして、src/test/kotlin フォルダーの下の Main.kt ファイルに貼り付けます。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.fail

class TestStudents{
    private val students: List<Student> = getStudents();

    @Test
    fun checkClassSize(){
        if (students.count() < 5){
            fail("The class is not full")
        }
    }

}

この例では、リスト内の学生オブジェクトの数をカウントする checkClassSize() という名前のテストを作成しました。カウントが 5 未満の場合は、fail() メソッドを呼び出してエラーを渡します。 メソッドの引数として message を指定します。

この例の fail() メソッドは Assertions クラスのジェネリック メソッドではないことに注意してください。 この例の fail() メソッドは、ジェネリックではない org.junit.jupiter.api パッケージからのものです。

このメソッドはジェネリックではないため、パラメーターを渡す必要はありません。 このテストを実行し、出力が次のようになっていることを確認します。

The class is not full
org.opentest4j.AssertionFailedError: The class is not full

まとめ

このチュートリアルでは、fail() メソッドを使用したときにコンパイル時エラーが発生する原因を学びました。 この警告を回避するためにメソッドの型を明示的に推測する方法を学びました。

最後の 2つのセクションでは、ラムダ式を使用するときに型が暗黙的に推論される方法と、ジェネリックではないメソッドを使用して型の推論を回避する方法を学びました。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub