2015-05-19 8 views
22

In Java, il programmatore può specificare previsto eccezioni per i casi di test JUnit come questo:prova eccezioni previste nel Kotlin

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

Come dovrei fare questo in Kotlin? Ho provato due varianti di sintassi, ma nessuno di loro ha lavorato:

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

risposta

28

La sintassi è semplice:

@Test(expected = ArithmeticException::class) 
12

È possibile utilizzare @Test(expected = ArithmeticException::class) o, meglio ancora uno dei metodi biblioteca di Kotlin come failsWith().

Si può rendere ancora più breve, utilizzando farmaci generici reificati e un metodo di supporto come questo:

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

e l'esempio usando l'annotazione:

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

} 
+0

'JavaClass ()' è deprecato ora. Utilizzare invece 'MyException :: class.java'. – user2138356

+0

failWith è deprecato, [assertFailsWith] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.test/assert-fails-with.html) dovrebbe invece essere usato. – gvlasov

24

Kotlin has its own test helper package che può aiutare a fare questo tipo di unittest. Aggiungere

import kotlin.test.* 

E il test può essere molto espressivo dall'uso assertFailWith:

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

assicurarsi di avere kotlin-test.jar nel vostro percorso di classe.

+0

Se ottieni un 404 sul tuo link, 'kotlin.test' è stato sostituito da qualcos'altro? – fredoverflow

+0

@fredoverflow No, non viene sostituito, ma appena rimosso dalle librerie standard. Ho aggiornato il collegamento al repository github kotlin ma sfortunatamente non riesco a trovare alcun collegamento alla documentazione. Comunque jar viene fornito da kotlin-plugin in intelliJ oppure puoi trovarlo in rete o aggiungere dipendenza maven/grandle al tuo progetto. –

+0

compile "org.jetbrains.kotlin: kotlin-test: $ kotlin_version" – mac229

7

Per questo è possibile utilizzare KotlinTest.

nel test, si può avvolgere di codice arbitrario con un blocco shouldThrow:

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