すべてのテストをEclipse(Eclipse 3.4 'Ganymede')で実行すると、「ルート化されていないテスト」の下に1つのテストがリストされます。私はJunit 3.8を使用しており、この特定のテストはTestCaseを拡張します。このテストと他のテストの間に違いはありません。これがEclipse 3.3(Europa)で発生したことを覚えていません。
明確化:
まだJUnit 4.0に移行していないため、注釈は使用していません。私もググって、ほとんどの人がJUnit 4で問題を抱えているように見えましたが、解決策はありませんでした。この時点で、テストはローカルとCruiseControlの両方で合格なので、あまり心配していませんが、興味があります。
しかし、これを最初に見たとき、他のテストで実行したときにのみ失敗する失敗したテストでした。これは、私が見つけたことのない「根付いていない」問題の解決策を探して、うさぎの穴を掘り下げました。結局、私は適切に分解されていない別のテストで犯人を見つけました。
私は同意します、それはEclipseの問題のように見えます。
最後に私は解決策を見つけました。問題は、アノテーションを使用してテストケースを定義するのではなく、「古い方法」で実行していることです。アノテーションの使用に切り替えるとすぐに、一度に1つのテストを再び実行できるようになります。
以下は、アノテーションを使用した基本的なテストの例です。
import static org.junit.Assert.*; // Notice the use of "static" here
import org.junit.Before;
import org.junit.Test;
public class MyTests { // Notice we don't extent TestCases anymore
@Before
public void setUp() { // Note: It is not required to call this setUp()
// ...
}
@Test
public void doSomeTest() { // Note: method need not be called "testXXX"
// ...
assertTrue(1 == 1);
}
}
「ルート化されていないテスト」エラーメッセージも表示され、それは魔法のように消えました。それは、私がEclipseをMavenプロジェクトで使用していたためだと思います。 Testクラスに新しいメソッドを追加して@Testアノテーションを付けると、[Junitテストとして実行]メニューオプションを使用してその1つのメソッドを実行しようとすると、エラーメッセージが表示され始めました。ただし、mavenビルドを実行すると、根付いていないテストメッセージが消えて、それが将来の問題の解決策であると思います。
JUnitが使用しているクラスを更新するため、Mavenビルドを実行します。
クラスがその階層のどこかでTestCaseを拡張する場合は、実行構成の下のドロップダウンにリストされているJUnit 3テストランナーを使用する必要があります。 JUnit 4ランナー(私が信じているデフォルト)を使用すると、根付いていないテスト現象が発生します。
このエラーが発生したのは、テストメソッドの名前を変更し、同じ実行構成をクリックしてEclipseでテストを実行しようとしたためです。現在は存在しない古いメソッドを参照しています。
テストプロジェクトがビルドされたことを確認することで問題を解決しました。ビルドパスに問題があり、テストクラスをコンパイルできませんでした。ビルドパスの問題を解決すると、テストがコンパイルされ、「新しい」メソッドを実行できるようになりました。したがって、「ルート化されていない」テストは、コンパイルされたバイナリにそれらが存在しないことも意味すると想定できます。
私はこれを見たことがありません-しかし、Googleを数分間ざっと流し読みする限り、これはテストの問題ではなく、Eclipseのバグである可能性があるように見えます。テストに@Testアノテーションがないと思いますか?テストを吹き飛ばして再作成できますか?そうであれば、同じエラーが発生しますか?
この問題の原因となる別のシナリオは、パラメーターが必要であるメソッドを盲目的にコピー/貼り付けすることでした。つまり.
import org.junit.Test;
public class MyTest {
@Test
public void someMethod(String param) {
// stuff
}
}
あなたはいくつかの簡単な解決策を持っています:
特定のテストメソッドで変数を定義する
それをインスタンス変数としてテストクラスに追加します
セットアップメソッドを作成し、@Before
で注釈を付ける
私にとっては、プロジェクトがビルドパスの問題を抱えていたことが原因でした。 Mavenの依存関係構成を更新する必要があります。
私はJava.lang.NoClassDefFoundErrorで同じ問題を抱えていました:org/hamcrest/SelfDescribing
瓶のハムクレストが必要です。同じ質問14539072: Java.lang.NoClassDefFoundError:org/hamcrest/SelfDescribing
これらは、ルート化されていないエラーが表示される2つのシナリオです。
テスト前に@Testアノテーションを見逃した場合。
@テスト
public void foo(){}
Gwtプロジェクトで、同じオブジェクトの2つのモックが定義されている場合。クラスAが1つあり、
@GwtMock private Aテスト;
@GwtMockプライベートA a;次に、ルート化されていないテストエラーも表示されます。
私はその問題を抱えていて、テストメソッドがそれを解決する前に "@ Test"を1つ入れました!
このような:
@Test public void testOne() { // ... assertTrue(1 == 1); }
テストクラスのjunit.framework.TestCaseをjunit1.4で拡張しないでください。これで問題が解決します。
個々のテストメソッドの実行構成でTestRunner ver 4.0から3に移行することで問題を修正できました。
Hamcrestを使用していますか?またはテストに役立つ別のライブラリ? 使用していません
import static org.junit.Assert.*;
テストで使用するかどうかを確認します。
import static org.hamcrest.MatcherAssert.assertThat;
または他のアサートはJUnitアサートではありません。
多分それは方法の目標についての論理的な混乱です。覚えておきましょう:
例えば。正しいタグ付きテスト方法:
@Test
@Transactional
@Rollback(true)
public void testInsertCustomer() {
(...)
}
-Eclipse Junitプラグインを使用すると、メソッドのコンテキストメニューを使用してそのテストメソッドを実行できます(たとえば、パッケージエクスプローラーでクラスとメソッドを展開し、「testInsertCustomer()」メソッドを選択し、その項目から[Run as >> JUnit test]を選択します)。 。
「@Test」タグを忘れた場合、または単にメソッドがテストではなく、他のテストのユーティリティとして使用する(プライベートかどうかにかかわらず)一般的なメソッド(たとえば、「プライベートfillCustomerObject()」)の場合、メソッドは「@Test」タグが必要です。JUnitテストとして実行することはできません。
ユーティリティメソッドを作成し、後でそのメソッドの本当の目的を忘れてしまうのは簡単です。そのため、テストとして実行しようとすると、JUnitは「ルート化されていないテスト」と叫びます。
テストをstatic
と宣言しないことで、この問題に遭遇しました。
私にとっての問題は、例外が@BeforeClass
または@AfterClass
メソッド。これにより、テストはルート化されていないものとして分類されます。
もう1つ試すことができるのは、JUnitのバージョンを少なくとも4.12にアップグレードすることです。
@RunWith(Parameterized.class)を使用するクラスを拡張したクラスでこの問題をしばらく経験していました。
しばらくして、これを引き起こした原因が正確にわからなくてすみません、「Unrooted Tests」メッセージが消えましたが、テストはまだ正しく実行されていませんでした。 @Parametersメソッドからの引数を受け入れるべきコンストラクターが呼び出されることはありませんでした。実行は@BeforeClassから@AfterClassに直接ジャンプしました。
その問題の修正は、JUnitを使用していた4.8.1から最新(4.12)にアップグレードすることでした。だから多分それは将来誰かを助けることができるでしょう。
私のビルドパスにエラーがあったことが判明しました...いくつかのjarが欠落していました。ビルドパスを再構成しましたが、うまくいきました!
「test」というテストメソッド名でこのエラーが発生しました
@Test
public void test() {
// ... assertTrue(1 == 1);
}
私はメソッドの名前を変更し、それが機能しました
私にとって、この問題は@AfterClass
メソッドでスローされたリアルタイムの例外によって作成されました(ドキュメントについては here を見てください)。
基本的にすべてのテストメソッドは成功しましたが、クラスの最後でこのメソッドは失敗していました。したがって、すべてのテストは問題ないようですが、私のEclipseには追加の「ルート化されていないテスト」が失敗しました。