Чтобы сделать это, вам нужно сделать две вещи: использовать метод [см. Правку ниже], а не значение, и, во-вторых, определить ваш @DataPoints
в сопутствующем объекте. Должно работать следующее:
object ScalaTheory {
@DataPoints
def numbers() = Array(1, 2, 3) // note def not val
}
@RunWith(classOf[Theories])
class ScalaTheory {
@Theory
def shouldMultiplyByTwo(number : Int) = {
// Given
val testObject = ObjectUnderTest
// When
val result = testObject.run(number)
// Then
assertTrue(result == number * 2)
}
}
Когда вы определяете методы или поля в сопутствующем объекте в Scala, вы получаете статический перенаправитель в классе. Декомпиляция с использованием JAD:
@Theories
public static final int[] numbers()
{
return ScalaTheory$.MODULE$.numbers();
}
Так что это решает статическую проблему. Тем не менее, когда мы используем val numbers = ...
, аннотация не переносится в поле, а для методов. Так что использование def
работает.
Как уже говорили другие, если вы разрабатываете с нуля, возможно, стоит начать с такой среды Scala, как scalatest. Интеграция инструмента с scalatest улучшается (то есть maven, Eclipse, Intellij), но это не уровень JUnit, поэтому оцените его для своего проекта перед началом.
РЕДАКТИРОВАТЬ: На самом деле, после этого обсуждения на scala-user , вы можете использовать val, но вам нужно указать компилятору scala применить аннотацию DataPoints к статическому перенаправителю:
object ScalaTheory {
@(DataPoints @scala.annotation.target.getter)
val numbers = Array(1, 2, 3)
}
В аннотации получателя сказано, что аннотация @DataPoints должна применяться к методу доступа для поля чисел, то есть метода numbers (), который создается компилятором. См. целевой пакет .