it-swarm.com.ru

Тест ожидаемых исключений в Котлине

В 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 ')'
43
fredoverflow

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

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

Kotlin имеет свой собственный пакет помощников по тестированию который может помочь в проведении такого рода юнит-тестов. добавлять 

import kotlin.test.*

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

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

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

45
Michele d'Amico

Вы можете использовать @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() {

}
18
Kirill Rakhman

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

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

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

Вы также можете использовать дженерики с пакетом kotlin.test:

import kotlin.test.assertFailsWith 

@Test
fun testFunction() {
    assertFailsWith<MyException> {
         // The code that will throw MyException
    }
}
4
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 }
    }
}
0
Frank Neblung