2011-12-26 8 views
1

私はJavaでScalaのJUnitテストでプロジェクトを持っています。各テストクラスは@TestでアノテートされていますScalaのクラスに適用される@Testアノテーションの目的は何ですか?

import org.junit.Test 

@Test 
class SomeTest { 
    ... 
} 

JUnit API@Testは、メソッドのアノテーションであることを述べています。しかし、メソッドの注釈をそのまま維持しながら、クラスから@Testの注釈を削除すると、Eclipseから実行すると多くのテストが実行されません。

@Testアノテーションをクラスに適用する目的は何ですか?また、これらのアノテーションが削除されたときにテストのいくつかが実行されないのはなぜですか?

答えて

4

Scalaは(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のonを使用すると、実際にはこのメソッドで終了します。

標準テストランナーからテストを実行している場合は、クラス上の@Testは違いがありません。考慮する唯一のものは、メソッドの@Testアノテーションです。

ScalaでJUnitを使用している場合は、Javaと同じルールに従ってください。

+0

良い説明。私のScalaアノテーションの知識は少しぼやけているので、コンパイラがJavaアノテーションの '@ Target 'を意図的に無視することはわかりませんでした。 –

2

JUnitの@Testアノテーションは、メソッド注釈は、ないクラス注釈(ソースhereを参照します)。したがって、クラスに@Testを追加する必要はないだけでなく、許可する必要もありません。

  • Eclipseはも、あなたはScalaのクラスに追加することができている:

    その奇妙です。

  • これはテストの動作を変更しています。

Eclipseや、おそらくEclipse Scalaプラグインのバグのような音がします。

「Eclipseから実行しているときに」多くのテストは実行されないと言います。これは、Eclipseの外ですべてのテストを正常に実行できることを意味しますか?

+0

本当に変です。コマンドラインからすべてのテストを正常に実行できます(mavenを使用)。 – vitaut

+0

私はスカラープラグインdevsがこれについてのバグレポートを愛すると確信しています –

+0

@ DanBurton私は私の答えで言うように、アノテーションは必ずしもバグではない一般的な問題であり、Eclipse特有のものではありません。 Eclipse内のjunitの場合、クラスに注釈があるだけでテストが実行されないのは正常な動作です。Scala-ide-devは通常のjunitランナーを使用します –

1

FYIとTestNGを使用すると、クラスレベルで@Testを指定することができます。これにより、このクラスのすべてのパブリックメソッドがテストに変換されます。しかし、はい、私が知る限り、JUnitはこれをサポートしていません。

関連する問題