2009-06-27 1 views
13

Я хочу установить ожидаемое исключение для теста JUnit 4 с помощью Scala. Я тока делать что-то похожее на следующее:Как установить ожидаемое исключение с помощью Scala и JUnit 4

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

Но я получаю следующее сообщение об ошибке компилятора:

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

Синтаксис в вопросе отлично подходит для меня в Scala 2.10.3. – SigmaX

ответ

8

То, как Scala имеет дело с атрибутами немного напуганный. Я думаю, что вы пытаетесь сделать, должно быть выражено следующим образом:

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

Yowzer ... случай, когда scala * меньше * выразительный, чем java? – skaffman

+0

Да, аннотации, вероятно, являются одной областью, мне не нравится язык. Существует это "если это называется значение ..." неявное правило, но, meh, а не настоящий фанат. Ах хорошо. –

+4

это не работает для меня. моя настройка: scala 2.9.2, junit 4.10. следующее сообщение об ошибке: «ожидаемый старт определения» – andreas

15

Это немного вперед, но синтаксис аннотаций в 2.8 изменился так же, как и то, что вы изначально разместили. Синтаксис Tristan опубликован правильно в текущей стабильной версии, но он дал мне ошибки, когда я обновил свой проект до ночного компилятора 2.8. Я предполагаю, что это связано с включением named and default arguments. Существует также some discussion в списке рассылки Scala. Цитирование 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

Это просто спасло меня от мира горя. Thx –

+1

В моем случае это не сработало, пока я не изменил оператор импорта из импорта junit.framework.Test import org.junit.Test (который, кажется, не имеет никакого значения в java) –

+0

+1 Теперь это правильный ответ для последняя версия Scala версии 2.10. –

0

Вы также можете попробовать specs с:

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

Эрик.

0

Использование ScalaTest и JUnit вместе, и вы можете сделать:

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

Это работает для меня (JUnit 4,10, Scala 2.10.2):

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

Подобно тому, что Tristan suggested, но этот синтаксис фактически компилируется и работает в моем проекте.

Редактировать: Э-э, глядя ближе, это именно то, что было в исходном вопросе. Ну, я думаю, что последний рабочий синтаксис также в ответах не повредит.