En Java, le programmeur peut spécifier les exceptions attendues pour les cas de test JUnit comme ceci:
@Test(expected = ArithmeticException.class)
public void omg()
{
int blackHole = 1 / 0;
}
Comment pourrais-je faire cela à Kotlin? J'ai essayé deux variantes de syntaxe, mais aucune d'entre elles n'a fonctionné:
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 ')'
La syntaxe est simplement:
@Test(expected = ArithmeticException::class)
Kotlin a son propre paquet d’assistance de test qui peut aider à faire ce genre de désagrément. Ajouter
import kotlin.test.*
Et votre test peut être très expressif en utilisant assertFailWith
:
@Test
fun test_arithmethic() {
assertFailsWith(ArithmeticException::class) {
omg()
}
}
Assurez-vous d'avoir kotlin-test.jar
dans votre chemin de classe.
Vous pouvez utiliser @Test(expected = ArithmeticException::class)
ou encore mieux l'une des méthodes de bibliothèque de Kotlin telles que failsWith()
.
Vous pouvez le rendre encore plus court en utilisant des génériques réifiés et une méthode d'assistance comme celle-ci:
inline fun <reified T : Throwable> failsWithX(noinline block: () -> Any) {
kotlin.test.failsWith(javaClass<T>(), block)
}
Et exemple en utilisant l'annotation:
@Test(expected = ArithmeticException::class)
fun omg() {
}
Vous pouvez utiliser KotlinTest pour cela.
Dans votre test, vous pouvez envelopper du code arbitraire avec un bloc shouldThrow:
shouldThrow<ArithmeticException> {
// code in here that you expect to throw a IllegalAccessException
}
Vous pouvez également utiliser des génériques avec le paquet kotlin.test:
import kotlin.test.assertFailsWith
@Test
fun testFunction() {
assertFailsWith<MyException> {
// The code that will throw MyException
}
}
JUnit 5.1 a support de kotlin intégré.
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 }
}
}