1. 概要

このチュートリアルでは、assertFailsWithメソッドを使用したKotlinでの例外のテストについて説明します。

まず、JUnit 5ライブラリを使用して例外をテストする方法について説明し、次にassertFailsWithメソッドについて説明します。

2. JUnit5の使用

例外は通常のプログラム実行フローを混乱させ、JVM言語の重要な部分です。 実行の処理は、このような問題を適切に処理するための手法です。

Kotinでは、さまざまなライブラリを使用して、例外がスローされることをテストできます。最も一般的なのはJUnitライブラリです。

JUnit 5 Jupiter APIは、テストケースの合格または不合格のステータスを判断するためのいくつかのアサーションメソッドを提供します。 より具体的には、JUnit 5は、Kotlin言語により適したアサーションメソッドをいくつか提供します。

Kotlinで例外をアサートするために使用できるJUnit5のそのようなメソッドの1つは次のとおりです。 assertThrows()。 さらに、この関数を使用すると、アサーション呼び出しの後にコードのブロックを追加して、これを読みやすくすることができます。

fun whenInvalidArray_thenThrowsException() {
    assertThrows<ArrayIndexOutOfBoundsException> {
        val array = intArrayOf(1, 2, 3)
        array[5]
    }
}

この例では、期待される ArrayIndexOutOfBoundsException がコードのブロックからスローされると、アサーションは成功します。 さらに、アサーションは、コードのブロックがArrayIndexOutOfBoundsException。の派生型である例外をスローした場合にも機能します。

3. KotlinのassertFailsWithメソッドの使用

Kotlin標準ライブラリは、例外をテストする関数も提供します。 assertFailsWithメソッドを使用して、コードのブロックが例外タイプで失敗したことを表明できます。

さらに、関数のパラメーターとしてメッセージを定義することもできます。 message はオプションであり、アサーションが失敗した場合にのみ失敗メッセージのプレフィックスとして使用されます。

fun givenInvalidArray_thenThrowsException() {
    assertFailsWith<ArrayIndexOutOfBoundsException>(
        message = "No exception found",
        block = {
            val array = intArrayOf(1, 2, 3)
            array[5]
        }
    )
}

上記の例では、ブロックが ArrayIndexOutOfBoundsException。をスローすると、アサーションはパスします。アサーションが失敗すると、メッセージが表示されます。

または、assertFailsWithメソッドを使用して、コードのブロックが特定の例外クラスで失敗したことを表明できます。 この例外クラスは、コードのブロックとともに関数のパラメーターとして定義されています。

fun givenInvalidFormat_thenThrowsException() {
    assertFailsWith(
        exceptionClass = NumberFormatException::class,
        block = { "Kotlin Tutorials in Baeldung".toInt() }
    )
}

この例では、アサーションはNumberFormatExceptionがコードのブロックからスローされることを想定しています。

さらに、 assertFailsWithメソッドを使用して、特定の例外クラスとメッセージの両方をパラメーターとしてコードのブロックとともに含めることもできます。

fun givenInvalidOperation_thenThrowsException() {
    assertFailsWith(
        exceptionClass = ArithmeticException::class,
        message = "No exception found",
        block = { 50 * 12 / 0 }
    )
}

上記の場合、 assertFailsWith メソッドは、コードblockが定義されたArithmeticExceptionをスローすることをアサートします。 指定されたメッセージは、アサーションが失敗するシナリオで使用されます。

3.1. 例外属性のアサート

assertFailsWith メソッドは常に例外タイプを返します。戻り値をさらに調べて、例外属性をアサートできます

fun givenInvalidNumericFormat_thenThrowsException() {
    val exception = assertFailsWith<NumberFormatException>(
        block = { Integer.parseInt("abcdefgh") }
    )
    assertThat(exception.message, equalTo("For input string: \"abcdefgh\""))
}

この例では、 assertFailsWith メソッドは、アサーションが成功した場合に例外を返します。 これにより、例外のmessage属性をアサートできます。

assertFailsWithメソッドは、同じタイプまたはそのサブタイプの例外を常にキャッチします。 ただし、単に指定するのではなく、テストが役立つように、常に正確にする必要があります。 例外また RuntimeException。

assertFailsWithメソッドがKotlin標準ライブラリに含まれているため、テストコードに追加のライブラリを含めるオーバーヘッドが削減されます。

したがって、例外をアサートするための単純な単体テストを作成する場合に役立ちます。 ただし、複数のアサーションを含む単体テストを作成する場合は、JUnitアサーションメソッドの方が適しています。

4. 結論

このチュートリアルでは、assertFailsWithメソッドを使用したKotlinでの例外のテストについて説明しました。

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

Kotlinの機能の詳細については、Kotlinチュートリアルのいずれかをご覧ください。