web-dev-qa-db-ja.com

Kotlinで予想される例外をテストする

Javaでは、プログラマは次のようにJUnitテストケースに予期される例外を指定できます。

@Test(expected = ArithmeticException.class)
public void omg()
{
    int blackHole = 1 / 0;
}

Kotlinでこれを行うにはどうすればよいですか? 2つの構文バリエーションを試しましたが、どれも機能しませんでした。

import org.junit.Test as test

// ...

test(expected = ArithmeticException) fun omg()
    Please specify constructor invocation;
    classifier 'ArithmeticException' does not have a companion object

test(expected = ArithmeticException.class) fun omg()
                           name expected ^
                                           ^ expected ')'
50
fredoverflow

構文は単純です:

@Test(expected = ArithmeticException::class)
74
fredoverflow

Kotlinには独自のテストヘルパーパッケージがあります この種類の単体テストの実行に役立ちます。追加する

import kotlin.test.*

そして、あなたのテストはassertFailWithを使うことで非常に表現力豊かになります:

@Test
fun test_arithmethic() {
    assertFailsWith(ArithmeticException::class) {
        omg()
    }
}

kotlin-test.jarクラスパス。

54
Michele d'Amico

@Test(expected = ArithmeticException::class)を使用できます。または、 failsWith() のようなKotlinのライブラリメソッドのいずれかを使用できます。

具象化されたジェネリックと次のようなヘルパーメソッドを使用すると、さらに短くすることができます。

inline fun <reified T : Throwable> failsWithX(noinline block: () -> Any) {
    kotlin.test.failsWith(javaClass<T>(), block)
}

そして、注釈を使用した例:

@Test(expected = ArithmeticException::class)
fun omg() {

}
19
Kirill Rakhman

これには KotlinTest を使用できます。

テストでは、shouldThrowブロックで任意のコードをラップできます。

shouldThrow<ArithmeticException> {
  // code in here that you expect to throw a ArithmeticException
}
12
monkjack

Kotlin.testパッケージでジェネリックを使用することもできます:

import kotlin.test.assertFailsWith 

@Test
fun testFunction() {
    assertFailsWith<MyException> {
         // The code that will throw MyException
    }
}
8
Majid

JUnit 5.1には kotlinサポート が組み込まれています。

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows

class MyTests {
    @Test
    fun `division by zero -- should throw ArithmeticException`() {
        assertThrows<ArithmeticException> {  1 / 0 }
    }
}
2
Frank Neblung