В Java программист может указать ожидаемые исключения для тестовых случаев JUnit следующим образом:
@Test(expected = ArithmeticException.class)
public void omg()
{
int blackHole = 1 / 0;
}
Как бы я сделал это в Котлине? Я пробовал два варианта синтаксиса, но ни один из них не работал:
import org.junit.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 ')'
kotlin.test
было заменено на что-то другое?Вы можете использовать
@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() { }
источник
javaClass<T>()
устарел.MyException::class.java
Вместо этого используйте .Для этого вы можете использовать KotlinTest .
В вашем тесте вы можете заключить произвольный код в блок shouldThrow:
shouldThrow<ArithmeticException> { // code in here that you expect to throw a ArithmeticException }
источник
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 } } }
источник
Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6
на assertThrows, убедитесь, что в вашем build.gradle естьcompileTestKotlin { kotlinOptions.jvmTarget = "1.8" }
Вы также можете использовать дженерики с пакетом kotlin.test:
import kotlin.test.assertFailsWith @Test fun testFunction() { assertFailsWith<MyException> { // The code that will throw MyException } }
источник
Расширение Assert, которое проверяет класс исключения, а также соответствие сообщения об ошибке.
inline fun <reified T : Exception> assertThrows(runnable: () -> Any?, message: String?) { try { runnable.invoke() } catch (e: Throwable) { if (e is T) { message?.let { Assert.assertEquals(it, "${e.message}") } return } Assert.fail("expected ${T::class.qualifiedName} but caught " + "${e::class.qualifiedName} instead") } Assert.fail("expected ${T::class.qualifiedName}")
}
например:
assertThrows<IllegalStateException>({ throw IllegalStateException("fake error message") }, "fake error message")
источник
Никто не упомянул, что assertFailsWith () возвращает значение, и вы можете проверить атрибуты исключения:
@Test fun `my test`() { val exception = assertFailsWith<MyException> {method()} assertThat(exception.message, equalTo("oops!")) } }
источник
Другая версия синтаксиса с использованием kluent :
@Test fun `should throw ArithmeticException`() { invoking { val backHole = 1 / 0 } `should throw` ArithmeticException::class }
источник
Первые шаги - добавить
(expected = YourException::class)
тестовую аннотацию@Test(expected = YourException::class)
Второй шаг - добавить эту функцию
private fun throwException(): Boolean = throw YourException()
В итоге у вас будет что-то вроде этого:
@Test(expected = ArithmeticException::class) fun `get query error from assets`() { //Given val error = "ArithmeticException" //When throwException() val result = omg() //Then Assert.assertEquals(result, error) } private fun throwException(): Boolean = throw ArithmeticException()
источник
org.junit.jupiter.api.Assertions.kt
/** * Example usage: * ```kotlin * val exception = assertThrows<IllegalArgumentException>("Should throw an Exception") { * throw IllegalArgumentException("Talk to a duck") * } * assertEquals("Talk to a duck", exception.message) * ``` * @see Assertions.assertThrows */ inline fun <reified T : Throwable> assertThrows(message: String, noinline executable: () -> Unit): T = assertThrows({ message }, executable)
источник