@Test注释应用于Scala中的类的目的是什么?

时间:2011-12-26 08:58:07

标签: eclipse scala testing junit scala-ide

我有一个Java项目,在Scala中使用JUnit测试。每个测试类都使用@Test注释:

import org.junit.Test

@Test
class SomeTest {
  ...
}

JUnit API@Test是方法注释。但是,当我从类中删除@Test注释同时保持方法注释不变时,从Eclipse运行时不会执行许多测试。

那么@Test注释应用于类的目的是什么?为什么在删除这些注释时某些测试不会运行?

3 个答案:

答案 0 :(得分:4)

Scala不检查ElementType注释(甚至在Scala IDE之外),因此Scala中的类的@Test注释没有“目的”。

实际上,您可以将任何注释应用于类,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注释。

当您在Scala中使用JUnit时,您应遵循与Java相同的规则。

答案 1 :(得分:2)

JUnit @Test注释是方法注释(参见源here),不是类注释。因此,不仅不需要将@Test添加到类中,甚至不应该允许它。

奇怪的是:

  • Eclipse甚至允许您将其添加到Scala类中。
  • 这改变了测试的行为。

听起来像Eclipse中的错误,或者更可能是Eclipse Scala插件。

你说在从Eclipse运行时没有执行许多测试。这是否意味着您可以在Eclipse之外成功运行所有测试?

答案 2 :(得分:1)

仅使用TestNG,您可以在类级别指定@Test,这会将此类的所有公共方法转换为测试。但是,据我所知,JUnit不支持这一点。