JUnit:テストutilsクラスで「実行不可能なメソッド」を回避する方法


118

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

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

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

Antスクリプトのjunitターゲットでこれらの特定のクラスを除外できることはわかっています。しかし、追加する新しいユーティリティクラスごとにビルドファイルを変更したくありません。また、クラスの名前を変更することもできます(ただし、クラスに適切な名前を付けることは、常に私の最も弱い才能でした:-)

この問題のエレガントな解決策はありますか?


テストはEclipse / NetBeans /お気に入りのIDEで動作しますか?
ゲルダ

私は日食を使います。実際には問題はありませんが、Eclipseはこれらのクラスを実行しようとしません。どうやって?
LiorH 2009年

私たちはあなたの質問を理解したかどうかわかりません。もう一度質問を読んで、情報を追加してください。
ゲルダ

1
@guerda:質問は私にはかなりはっきりしているようです。彼のAntタスクは、フィルターがユーティリティクラスを取得しているため、テストを含まないクラスを見つけることです。したがって、私の答えは、完全に関連があると私はまだ信じています。
Jon Skeet、

LiorH:説明をありがとう、それで私の答えは無駄です:)
guerda

回答:


50

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


1
彼がJUnit 4.4に移動したのでそれは問題にならなかったので、私はそれが役に立たないと思います。
ゲルダ

2
あなたは私の答えの要点を逃したようです。テストと見なされるクラスを決定する名前フィルターがあります。フィルターを変更すると、ヘルパークラスを簡単に除外できます。
Jon Skeet、

1
あなたの提案は有効ですが、テストクラスをチェックアウトしたところ、一部はTestで始まり、一部はTestで終わりました。ユーティリティクラスと実際のテストクラスの明確な区別はありません。あなたが提案した慣習は良い習慣だと思いますか?(つまり、utilsはTestで始まり、テストはTestで終わります)
LiorH 2009年

4
テストケースクラスの末尾に* Testを付けるのは、ほとんど慣例です。テストクラスの名前を適切に変更してリファクタリングし、ヘルパーの名前も変更して、サフィックスの規則が使用されないようにする必要がある場合があります。
スポーク2009年

2
スポークに同意します。クラスの名前からそれがテストなのかヘルパーなのかわからない場合は、クラスの名前を変更する必要があります。慣例は、「クラスはTestで終わる場合にのみ、テストである」です。ユーティリティクラスはTestで始まっていてもいなくてもかまいません。重要ではありません。
ジョンスキート

142

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


6
実際、そうではありません。@Ignoreはテストを一時的に無効にするためのものです。
アリス・ヤング

1
申し訳ありませんが、それは悪い考えです。テストパターンと一致する可能性があるという理由だけで、テスト関連の注釈を使用して本番コードに注釈を付けたいですか?適切な答えは、クラス名がテストのパターンマッチングをトリガーしている場合は、それらを修正することです。そして、パターンがTestで終わるクラスのみを検出することを確認してください。これは一般的に受け入れられているパターンです
Kevin M

ええ、これは悪いことであり、削除できない別の賛成票を投稿するまで気づきませんでした。基本クラスを抽象化すると、JUnitはそれを無視します。以下の@gmooreの回答を参照してください。
ライアンシリントン

83

私の特定のケースには、次のシナリオがあります。私たちのテスト

public class VenueResourceContainerTest extends BaseTixContainerTest

すべて伸びる

BaseTixContainerTest

そして、JUnitはBaseTixContainerTestを実行しようとしていました。かわいそうなBaseTixContainerTestは、コンテナーをセットアップし、クライアントをセットアップし、ピザを注文してリラックスしようとしていました...男。

前述のように、クラスに注釈を付けることができます

@Ignore

しかし、そのためJUnitはそのテストをスキップしたと報告しました(完全に無視されたのではなく)。

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

そのようなことで私は苛立ちました。

そこで私はBaseTixContainerTestを抽象化しましたが、今ではJUnitはそれを本当に無視しています。

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

7
より良い@Ignore
neworld 2015

私は@Ignoreアプローチを試してみて、それは良いことだと思ったので、この答えを読んで、「もちろん!」
dnuttle 2017年

38

JUnitがテストの基本クラスをインスタンス化しないようにするには、

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

(@Ignoreは、一時的に無視されたテストのために予約した、無視されたと報告します。)


3
JUnitランナーは、抽象クラスもインスタンス化しようとすることが多く、インスタンス化エラーで失敗します。
ホリーカミンズ2014

私の基本テストクラス
ruX

3
これは、名前がTestで終わっていないために機能し、abstract修飾子が原因ではありません。クラス名をMyBaseClassTestに変更すると、@ HollyCumminsで言及されているようにインスタンス化が試行されます(失敗します)
Hutch

私の場合、それはであるはずですprotected abstract class
ミスティック林

18
  1. これが、たとえばAbstractTestなどのベーステストクラスであり、すべてのテストがこれを拡張する場合、このクラスを抽象として定義します。
  2. Utilクラスの場合は、クラス名から* Testを削除して、MyTestUtilやUtilsなどに変更します。

10

IDEのコード補完を使用してインポートを追加するときは注意してください @Test

たとえばimport org.junit.Test、そうimport org.testng.annotations.Testである必要はありません。後者を実行すると、「実行可能なメソッドがない」というエラーが発生します。


これは回答ではなくコメントである必要があります。
スワランガサルマ

3
理由はわかりません。それは有効な解決策です。
Sridhar Sarnobat 16

4
Intellij Idea 2017は、org.junit.jupiter.api.Test代わりにインポートすることで頭が混乱しました!しかし、あなたのおかげで解決されました
AmiNadimi

どうもありがとうございました。「実行可能なメソッドがありません」という問題が発生して混乱しました。
Peter S.

7

Antには、ユーザーskipNonTestsが探しているように正確に機能するように設計された属性が付属しています。基本クラスを変更して、抽象化したり、注釈を追加したりする必要はありません。


2
それはskipNonTests信じられないほど便利に見えるので、この属性はant 1.9+でのみ利用可能であるように見えます。これは残念です。また、抽象テストスーパークラスも除外されます。
ホリーカミンズ2014

4

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

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

8
しかし、それは私たちが持っているテストの数を誤って増やします:)それは大したことではありません
Sudarshan

1

テストクラスでimport org.junit.jupiter.api.Test;と書いた場合 それを削除してimport org.junit.Testと書きます。この場合、それも私に働きました。


1
驚くべきことに、それはうまくいきました。Windowsコマンドラインで手動で実行しました。しかし、別の問題がそれである@BeforeAll@AfterAll実行されません。
BingLi224

どうやら、JUnit4は動作しました(@BeforeClassおよび@AfterClassで動作しますが、JUnit5は動作しません。参照:junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

最も単純なコードの一部(@ Test、@ Beforeを使用するなど)を実行すると、同様の問題(「実行不可能なメソッド..」)にも直面し、解決策がどこにも見つからなかった。Junit4とEclipse SDKバージョン4.1.2を使用していました。最新のEclipse SDK 4.2.2を使用して問題を解決しました。これが、多少似たような問題で苦労している人々の役に立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.