10

JUnit 3のTestCaseから継承されたTestクラスで内部クラスを定義するときに、いくつかの問題が発生します。シナリオは次のようになります。

Foo.java

public class Foo {
  public void method() { ... }
}

FooTest.java

public class FooTest extends TestCase {
  public class Bar extends Foo {
    public void method() { ... }
  }
  public void testMethod() { ... }
}

これをEclipseから実行すると、テストは正常に実行されますが、Antタスクから実行しようとすると失敗します。

[junit] junit.framework.AssertionFailedError:クラスFoo $ BarにはパブリックコンストラクターTestCase(String name)またはTestCase()がありません

Barはテストクラスではありません。テスト時に実際の処理を行う必要がないメソッドをオーバーライドするFooのサブクラスにすぎません。

私は今のところかなり迷っていて、この問題にどのように取り組むべきかわかりません。サブクラスをスタンドアロンとして作成する唯一の方法はありますか?

4

4 に答える 4

18

これは、ネストされたクラスをjunitファイルセットに含めたためです。build.xmlに「excludes」プロパティを追加します。

例えば:

<target name="test" depends="test-compile">
    <junit>
        <batchtest todir="${test.build.dir}" unless="testcase">
            <fileset dir="${test.build.classes}"
                includes = "**/Test*.class"
                excludes = "**/*$*.class"/>
        </batchtest>
    </junit>
</target>  
于 2012-03-22T09:52:44.333 に答える
5

Barクラスを静的として定義してみることができます。

public class FooTest extends TestCase {
  public static class Bar extends Foo {
    public void method() { ... }
  }
  public void testMethod() { ... }
}

...しかし、ある環境では機能するが別の環境では機能しないという事実は、次の2つのいずれかを示唆しています。

  1. Javaバージョン
  2. クラスパス
  3. [編集:以下のJimの提案による]junit.jarのさまざまなバージョン
于 2010-11-11T03:23:17.780 に答える
4

すべての内部クラスを除外したくない場合は、ネストされたクラス@Ignoreに注釈を付けることもできます。

于 2012-07-29T11:58:34.650 に答える
4

私はネクポスターのように感じていますが、今日はMavenで同様の問題に遭遇しました。

通常はうまく動作しますが、 -mvn testのような特定のパッケージからテストを実行したい場合はスローされます。これは、JUnit3と4の両方で「機能」します。mvn test -Dtest=com.test.*initializationError

私のMavenケースの理由を見つけました。これは、アリの場合も同じかもしれません。デフォルトでは、mavenのテストプラグイン(つまり、surefire)は、すべてのクラスの特定のサブセットのみを「テストクラス」と見なします。つまり、* Testなどの名前で検索します(これについては、surefireのホームページで読むことができます)。 )プロパティを定義すると、testデフォルトの動作を完全にオーバーライドします。これは、-Dtest=com.test.*surefireを使用すると、だけでcom.test.MyTestClassなくcom.test.MyTestClass.InnerClass、さらにはcom.test.MyTestClass$1(つまり、匿名のクラス)も取得することを意味します。

したがって、たとえば、あるパッケージからクラスを実行するには、次のようなものを使用する必要があります-Dtest=com.test.*Test(もちろん、テストクラスを識別するためにサフィックスを使用する場合)。

于 2011-03-25T14:32:11.507 に答える