web-dev-qa-db-ja.com

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

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

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

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

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

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

111
LiorH

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

46
Jon Skeet

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

137
JoelPM

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

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
78
gmoore

JUnitがテストベースクラスをインスタンス化しないようにするには

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

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

36
froh42
  1. これがたとえばAbstractTestの基本テストクラスであり、すべてのテストがこれを拡張する場合、このクラスをabstractとして定義します
  2. Utilクラスの場合は、クラス名を* Testから削除し、MyTestUtilまたはUtilsなどに変更します。
15
Raghu K Nair

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

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

8

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

7
mc1arke

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

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

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

1
illuminatos

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

0
Rahul Vig