Я хочу автоматически регистрировать имена тестов модулей в Scala. Решение с org.junit.rules.TestName
отлично работает на Java, но не в Scala.Имя тестового устройства в Scala
Рассмотрим следующий фрагмент кода:
import org.junit._
import org.junit.rules.TestName
class ScalaUnitTestExample {
@Rule val testName = new TestName
@Before def printTestCaseNameBefore() {
print("\nStart of test case " + testName.getMethodName)
}
@After def printTestCaseNameAfter() {
print("\nEnd of test case " + testName.getMethodName)
}
@Test
def checkAddition() {
Assert.assertEquals(5, 2 + 3)
}
@Test
def checkMultiplication() {
Assert.assertEquals(6, 2 * 3)
}
}
Это компилирует нормально, но при запуске я получаю следующее сообщение об ошибке:
There was 1 failure:
1) initializationError(ScalaUnitTestExample)
java.lang.Exception: The @Rule 'testName' must be public.
at org.junit.internal.runners.rules.RuleFieldValidator.addError(RuleFieldValidator.java:90)
(...)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
FAILURES!!!
Tests run: 1, Failures: 1
Аналогом Java работает, как ожидалось.
Я уже пробовал следующее (согласно Using JUnit @Rule with ScalaTest (e.g. TemporaryFolder)):
val _testName = new TestName
@Rule def testName = _testName
, но это не помогло. В этой версии запускаются тестовые примеры, но результат {testName} всегда {null}.
Правило доступа по умолчанию в Scala является общедоступным, и поэтому ключевое слово public
не является общедоступным. С другой стороны, структура JUnit, похоже, считает ее непубличной.
Кто-нибудь знает, как преодолеть эту проблему? Другое подобное решение также будет прекрасным! Спасибо!
Почему вы не используете ScalaTest вместо этого? Вы сможете увидеть имя теста в журналах, и есть альтернативы для '@ Before' и' @ After'. – Zyoma
Проблема с первым вариантом заключается в том, что 'val testName' определяет как поле, так и метод getter (в терминах Java); аннотация указывается в поле по умолчанию (но это можно изменить: см. http://www.scala-lang.org/api/2.11.8/#scala.annotation.meta.package); поле является приватным (Scala не позволяет определять неличные поля вообще), но JUnit требует, чтобы он был общедоступным. Удивительно, что второй вариант не работает. –