测试Kotlin中的预期异常

fre*_*low 56 testing unit-testing exception kotlin

在Java中,程序员可以为JUnit测试用例指定预期的异常,如下所示:

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

我怎么在Kotlin做这个?我尝试了两种语法变体,但没有一种工作:

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 ')'
Run Code Online (Sandbox Code Playgroud)

fre*_*low 82

语法很简单:

@Test(expected = ArithmeticException::class)
Run Code Online (Sandbox Code Playgroud)


Mic*_*ico 62

Kotlin有自己的测试帮助程序包,可以帮助进行这种单元测试.加

import kotlin.test.*
Run Code Online (Sandbox Code Playgroud)

并且您的测试可以通过使用非常具有表现力assertFailWith:

@Test
fun test_arithmethic() {
    assertFailsWith(ArithmeticException::class) {
        omg()
    }
}
Run Code Online (Sandbox Code Playgroud)

确保kotlin-test.jar你的班级路径.

  • 编译"org.jetbrains.kotlin:kotlin-test:$ kotlin_version" (5认同)
  • @ mac229 s / compile / testCompile / (3认同)

Kir*_*man 19

您可以使用@Test(expected = ArithmeticException::class)甚至更好的Kotlin库方法之一failsWith().

你可以使用reified泛型和这样的辅助方法使它更短:

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

以及使用注释的示例:

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

}
Run Code Online (Sandbox Code Playgroud)


mon*_*ack 14

你可以使用KotlinTest.

在测试中,您可以使用shouldThrow块来包装任意代码:

shouldThrow<ArithmeticException> {
  // code in here that you expect to throw a ArithmeticException
}
Run Code Online (Sandbox Code Playgroud)


Fra*_*ung 14

JUnit5内置了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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我首选的答案。如果您在assertThrows上收到“无法将使用JVM目标1.8构建的字节码内联到使用JVM目标1.6构建的字节码”,请确保您的build.gradle具有“compileTestKotlin {kotlinOptions.jvmTarget =“1.8”}” (3认同)

小智 8

您还可以将泛型与kotlin.test包一起使用:

import kotlin.test.assertFailsWith 

@Test
fun testFunction() {
    assertFailsWith<MyException> {
         // The code that will throw MyException
    }
}
Run Code Online (Sandbox Code Playgroud)


Sve*_*olk 7

没有人提到assertFailsWith()返回值,你可以检查异常属性:

@Test
fun `my test`() {
        val exception = assertFailsWith<MyException> {method()}
        assertThat(exception.message, equalTo("oops!"))
    }
}
Run Code Online (Sandbox Code Playgroud)