Какова цель аннотации @Test, применяемой к классу в Scala? - PullRequest
1 голос
/ 26 декабря 2011

У меня есть проект на Java с тестами JUnit в Scala.Каждый тестовый класс помечается @Test:

import org.junit.Test

@Test
class SomeTest {
  ...
}

JUnit API говорит, что @Test является аннотацией метода.Однако, когда я удаляю аннотации @Test из классов, оставляя аннотации методов нетронутыми, многие тесты не выполняются при запуске из Eclipse.почему некоторые тесты не запускаются, когда эти аннотации удалены?

Ответы [ 3 ]

4 голосов
/ 26 декабря 2011

Scala не проверяет ElementType на наличие аннотаций (даже вне Scala IDE), поэтому нет никакой цели для аннотации @Test для класса в Scala.

Фактически, вы можете применить любую аннотацию к классу, Scala не препятствует этому. Используя следующий пример:

import org.junit.Test
import org.junit.Rule

@Rule
class Foo {
    @Test
    def test(filename: String) = println("test");
}

после компиляции вы получаете аннотацию @Rule для класса. Это известная функция , потому что AFAIK, вы можете «применить» аннотацию к полю в источнике, но на самом деле окажетесь в методе, если вы используете одну из целевых аннотаций .

Если вы проводите свои тесты через любого из стандартных тестовых исполнителей, @Test в классе не должно иметь никакого значения. Единственное, что имеет значение - это аннотация @Test для метода.

Когда вы используете JUnit в Scala, вы должны следовать тем же правилам, что и в Java.

2 голосов
/ 26 декабря 2011

Аннотация JUnit @Test является аннотацией метода (см. Источник здесь ), не аннотацией класса. Так что не только нет необходимости добавлять @Test в класс, это даже не должно быть разрешено.

Странно, что:

  • Eclipse даже позволяет вам добавлять его в класс Scala.
  • Это меняет поведение тестов.

Звучит как ошибка в Eclipse или, более вероятно, в плагине Eclipse Scala.

Вы говорите, что многие тесты не выполняются "при запуске из Eclipse". Значит ли это, что вы можете успешно запустить все тесты вне Eclipse?

1 голос
/ 26 декабря 2011

FYI с TestNG, вы можете указать @Test на уровне класса, и это превратит все открытые методы этого класса в тесты.Но да, насколько я знаю, JUnit не поддерживает это.

...