Подтвердить что ты не робот

Проверить ожидаемые исключения в Котлине

В Java программист может указать ожидаемые исключения для тестовых примеров JUnit следующим образом:

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

Как бы я сделал это в Котлине? Я пробовал два варианта синтаксиса, но никто из них не работал:

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 ')'
4b9b3361

Ответ 1

Синтаксис просто:

@Test(expected = ArithmeticException::class)

Ответ 2

У Kotlin есть свой тестовый вспомогательный пакет, который может помочь сделать этот способ unittest. Добавить

import kotlin.test.*

И ваш тест может быть очень выразительным с помощью assertFailWith:

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

Убедитесь, что у вас есть kotlin-test.jar в вашем пути к классу.

Ответ 3

Вы можете использовать @Test(expected = ArithmeticException::class) или даже лучше один из методов библиотеки Kotlin, таких как failsWith().

Вы можете сделать это еще короче, используя обобщенные дженерики и вспомогательный метод, подобный этому:

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

И пример использования аннотации:

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

}

Ответ 4

Вы можете использовать KotlinTest для этого.

В вашем тесте вы можете обернуть произвольный код блоком shouldThrow:

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