Как установить ожидаемое исключение с помощью Scala и JUnit 4

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

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

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

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

Ответы

Ответ 2

Это немного вперед, но синтаксис аннотаций в 2.8 изменился так же, как и то, что вы первоначально разместили. Синтаксис Tristan опубликован правильно в текущей стабильной версии, но он дал мне ошибки, когда я обновил свой проект до ночного компилятора 2.8. Я предполагаю, что это связано с включением имени и аргументов по умолчанию. Существует также обсуждение в списке рассылки Scala. Цитируя Лукаса Ритца:

Также обратите внимание, что в 2.8.0 синтаксис аннотаций java больше не будет использовать имя-значение вместо аргументов вместо аргументов, т.е.

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

Ответ 3

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

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

Эрик.

Ответ 4

Используйте 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]
  }
}

Ответ 5

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

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

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

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