2011-12-26 2 views
1

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

import org.junit.Test 

@Test 
class SomeTest { 
    ... 
} 

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

Итак, в чем цель аннотации @Test к классу и почему некоторые из тестов не выполняются при удалении этих аннотаций?

ответ

4

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 для класса. Это known feature, потому что AFAIK, вы можете «применить» аннотацию в поле в источнике, но на самом деле окажетесь в методе, если вы используете на target annotations.

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

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

+0

Хорошее объяснение. Мое знание аннотаций Scala немного туманно, и я не понимал, что компилятор сознательно игнорирует аннотации '@ Target' Java. –

2

JUnit @Test аннотации представляет собой метод аннотация (см источника here), не класса аннотация. Поэтому не только необязательно добавлять класс @Test, его также нельзя допускать.

Это странно, что:

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

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

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

+0

Странно. Я могу успешно запустить все тесты из командной строки (используя maven). – vitaut

+0

Я уверен, что разработчикам scala-плагинов понравится отчет об ошибке на этом –

+0

@DanBurton, как я уже сказал в своем ответе, но аннотация - общая проблема, которая не обязательно является ошибкой, она не является специфичной для Eclipse. Для junit внутри Eclipse это нормальное поведение, когда тесты не запускаются, если вы просто используете аннотацию для класса.Scala-ide-dev использует нормальные бегуны junit –

1

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

Смежные вопросы