2009-03-23 3 views
92

私はJUnit3.8からJUnit4.4に切り替えました。私はantを使ってテストを実行します。すべてのテストは正常に実行されますが、テストユーティリティのクラスは「実行可能メソッドがありません」というエラーで失敗します。私が使用しているパターンは、テストフォルダの下に* Test *という名前のすべてのクラスを含めることです。JUnit:テストutilsクラスで「実行可能メソッドなし」を避ける方法

私は、ランナーが@Test属性で注釈を付けられたメソッドを見つけることができないことを理解します。しかし、これらのクラスはテストではないため、アノテーションは含まれていません。 驚くべきことに、これらのテストをEclipseで実行しているときに、これらのクラスについては不平を言っていません。

JUnit3.8では、これらのユーティリティクラスはTestCaseを拡張していないので、ランナーはそれらを実行しようとしなかったため、まったく問題はありませんでした。

私はantスクリプトのjunitターゲットでこれらの特定のクラスを除外できます。しかし、私が追加する新しいユーティリティクラスごとにビルドファイルを変更したくないです。私はクラスの名前を変更することもできます(しかし、クラスに良い名前をつけることは、常に私の弱い才能でした:-))

この問題の解決策はありますか?

+0

あなたのテストはEclipse/NetBeans /あなたの好きなIDEで動作しますか? – guerda

+0

私はEclipseを使用しています。実際にそこに問題はありません、どういうわけかeclipseはこれらのクラスを実行しようとしません。どのように思う? – LiorH

+0

私はあなたの質問を理解したかどうかわかりません。あなたの質問をもう一度読んで、おそらくいくつかの情報を追加してください。 – guerda

答えて

41

テストクラスを見つけるためのパターンを制御しているとすれば、*Test*ではなく*Testに一致するように変更することをお勧めします。その方法はTestHelperと一致しませんが、FooTestとなります。

+1

彼はJUnit 4.4に移行していて、それは問題ではないので、助けはないと思います。 – guerda

+2

あなたは私の答えのポイントを見逃したようです。彼はテストとしてみなされるクラスを決定するための名前フィルタを持っています。彼がフィルタを変更すると、ヘルパークラスを簡単に除外できます。 –

+1

あなたの提案は有効ですが、私はテストクラスをチェックアウトして、いくつかはTestで始まり、Testで終わるものもあります。ユーティリティクラスと実際のテストクラスの間に明確な区別はありません。あなたが提案した大会は良い練習だと思いますか? (つまり、utilsはTestで始まり、Testでテストは終了します) – LiorH

4

これらのクラスに空のテストメソッドを追加するとどうなりますか?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() { 
    assertTrue(true); // do nothing; 
} 
+0

面白い、ありがとう – LiorH

+6

しかし、それは誤って私たちが持っているテストの数を増加させる:)その大したことではない – Sudarshan

128

@Ignoreでutilクラスに注釈を付けます。これにより、JUnitはテストとして実行されないようになります。

+9

ありがとう。これは受け入れられた答えでなければなりません! –

+6

実際、そうではありません。 @Ignoreはテストを一時的に無効にするためのものです。 –

+1

申し訳ありませんが、それは悪い考えです。テストパターンにマッチする可能性があるという理由だけで、テスト関連の注釈でプロダクションコードに注釈を付ける必要がありますか?適切な答えは、クラス名がテスト用のパターンマッチングをトリガーしている場合に修正することです。そして、パターンが、Testで終わるクラスだけを見つけることを確認してください。それは一般的に受け入れられているパターンです –

70

私の場合、次のような場合があります。私たちのテストでは

public class VenueResourceContainerTest extends BaseTixContainerTest 

すべてが

BaseTixContainerTest 

を拡張し、JUnitはBaseTixContainerTestを実行しようとしていました。貧弱なBaseTixContainerTestは、コンテナのセットアップ、クライアントのセットアップ、ピザの注文、リラックスした...男性の試しでした。

は、前述したように、あなたは

@Ignore 

でクラスに注釈を付けることができますしかし、それはスキップされて(完全に無視することはなく)そのテストを報告してJUnitのを引き起こしました。

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1 

そんな私を苛立たせる。

私はBaseTixContainerTest abstractを作成しましたが、今やJUnitはそれを本当に無視します。ちょうどそれ

public abstract class MyTestBaseClass { ... whatever... } 

作るテストベースクラスをインスタンスからJUnitのを防止するために

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 
+5

'@ Ignore'よりもかなり良い – neworld

+0

これも私の問題を解決しました、ありがとう! – Rumal

+0

私は@ Ignoreアプローチを試してみました。うまくいきました。この答えを読んだら、額の中で自分を叩きました。 "Of * course *!" – dnuttle

31

無視として(@ignoreは私が一時的無視テスト用に予約され、それを報告します。)

+2

JUnitランナーは抽象クラスもインスタンス化し、インスタンス化エラーで失敗することがよくあります。 –

+0

基本テストクラスのために完全に動作します – ruX

+2

これは名前のために機能しています(テストでは終了しません)。抽象修飾子のためではありません。クラス名をMyBaseClassTestに変更すると、@HollyCumminsで説明したようにインスタンス化しようとします(そして失敗します) – Hutch

0

シンプルなコード(@Test、@Beforeなどを使用しています)を実行する上で同様の問題(「実行可能メソッドなし..」)に直面していました。私はJunit4とEclipse SDKバージョン4.1.2を使用していました。最新のEclipse SDK 4.2.2を使用して私の問題を解決しました。私はこれがやや似たような問題に苦しんでいる人々に役立つことを願っています。

5

アングルには、あなたが探しているようにデザインされたskipNonTests属性が付属しています。基本クラスを抽象クラスに変更したり、アノテーションを追加する必要はありません。

+1

'skipNonTests'属性はant 1.9+でしか利用できないように見えます。抽象テストのスーパークラスも除外されます。 –

4

@Testのインポートを追加するためにIDEのコード補完を使用する場合は注意してください。

import org.junit.Testであり、例えばimport org.testng.annotations.Testでなくてもよい。後者の場合は、「実行可能メソッドがありません」というエラーが表示されます。

+0

これは答えではなくコメントでなければなりません。 –

+1

私はなぜそれが表示されません。これは有効な解決策です。 –

+1

Intellij Idea 2017は、代わりに 'org.junit.jupiter.api.Test'をインポートして私の頭を悩ましていました!しかし、あなたのおかげでそれは今解決されています – AmiNadimi

10
  1. これは、たとえば、あなたのベーステストクラスであればAbstractTestと、すべてのテストが、これを拡張することがUtilのクラスであれば、抽象
  2. として、このクラスを定義することは、その後、より良い、それはMyTestUtilある名前を変更クラスから*テストを削除
関連する問題