2009-06-27 12 views
13

Desidero impostare un'eccezione prevista per un test JUnit 4 utilizzando Scala. Sono in corso facendo qualcosa di simile al seguente:Come impostare un'eccezione prevista utilizzando Scala e JUnit 4

@Test(expected=classOf[NullPointerException]) 
def someTest() = { 
    // Some test code 
} 

Ma ottengo il seguente errore del compilatore: offerte Scala

error: wrong number of arguments for constructor Test:()org.junit.Test 
+2

La sintassi nella domanda funziona correttamente in Scala 2.10.3. – SigmaX

risposta

8

la strada con attributi è un po 'eccentrico. Penso che quello che stai cercando di fare dovrebbe essere espresso in questo modo:

@Test { val expected = classOf[ NullPointerException] } 
def someTest { 
    // test code 
} 
+0

Yowzer ... un caso in cui scala è * meno * espressivo di java? – skaffman

+0

Sì, le annotazioni sono probabilmente l'unica area in cui non mi piace la lingua. C'è questa regola implicita "se si chiama valore ...", ma, meh, non un vero fan. Ah bene. –

+4

questo non funziona per me. il mio setup: scala 2.9.2, junit 4.10. seguente messaggio di errore: "avvio previsto della definizione" – andreas

15

Questo è un po 'in attesa, ma la sintassi per le annotazioni in 2.8 è cambiata per essere la stessa di quella originariamente pubblicata. La sintassi Tristan pubblicata è corretta nell'attuale versione stabile, ma mi ha dato errori quando ho aggiornato il mio progetto a un compilatore notturno 2.8. Suppongo che ciò sia dovuto all'inclusione di named and default arguments. C'è anche some discussion sulla mailing list di Scala. Citando Lukas Rytz:

Also note that in 2.8.0 the syntax for java annotations will no longer use the name-value pairs but named arguments instead, i.e.

@ann{ val x = 1, val y = 2} ==> @ann(x = 1, y = 2) 
+1

Questo mi ha salvato da un mondo di dolore. Thx –

+1

Nel mio caso non ha funzionato fino a quando ho cambiato l'istruzione import da import junit.framework.Test import org.junit.Test (che sembra non fare alcuna differenza con java) –

+0

+1 Questa è ora la risposta corretta per l'ultima versione di Scala 2.10. –

0

Si può anche provare specs con:

class mySpec extends SpecificationWithJUnit { 
    "this expects an exception" in { 
    myCode must throwA[NullPointerException] 
    } 
} 

Eric.

0

Usa ScalaTest e JUnit insieme e si può fare:

import org.scalatest.junit.JUnitSuite 
import org.scalatest.junit.ShouldMatchersForJUnit 
import org.junit.Test 

class ExampleSuite extends JUnitSuite with ShouldMatchersForJUnit { 

    @Test def toTest() { 
    evaluating { "yo".charAt(-1) } should produce [StringIndexOutOfBoundsException] 
    } 
} 
0

Questo funziona per me (JUnit 4.10, Scala 2.10.2):

@Test(expected = classOf[NullPointerException]) 
def testFoo() { 
    foo(null) 
} 

Simile a quello che Tristan suggested, ma questa sintassi in realtà compila e lavora nel mio progetto.

Modifica: Uh, guardando più vicino, questo è esattamente ciò che la domanda originale aveva. Bene, suppongo che avere l'ultima sintassi di lavoro anche nelle risposte non guasta.