1. ホーム
  2. java

[解決済み] JUnitの混乱:'extends TestCase'を使うか'@Test'を使うか?

2022-04-22 20:27:06

質問

JUnitの正しい使い方(少なくともドキュメント)は非常にわかりにくいものだと感じています。 この質問は、将来の参考と実際の質問の両方を兼ねています。

私の理解が正しければ、JUnitのテストを作成し実行するには、主に2つのアプローチがあります。

アプローチA(JUnit 3スタイル)。 TestCase を継承したクラスを作成し、テストメソッドの先頭に test . このクラスを JUnit テストとして (Eclipse で) 実行すると、すべてのメソッドの先頭が test が自動的に実行されます。

import junit.framework.TestCase;

public class DummyTestA extends TestCase {

    public void testSum() {
        int a = 5;
        int b = 10;
        int result = a + b;
        assertEquals(15, result);
    }
}

アプローチB(JUnit 4スタイル)。 通常の'クラス'を作成し、その前に @Test のアノテーションをメソッドに追加します。メソッドの先頭に test .

import org.junit.*;
import static org.junit.Assert.*;

public class DummyTestB {

    @Test
    public void Sum() {
        int a = 5;
        int b = 10;
        int result = a + b;
        assertEquals(15, result);
    }
}

この2つを混在させるのは良くないようです。 このstackoverflowの質問 :

さて、私の質問です。

  1. 望ましいアプローチとは また、どのような場合にどちらかを使うのでしょうか?
  2. アプローチBでは、以下のように@Testアノテーションを拡張することで、例外に対するテストが可能になります。 @Test(expected = ArithmeticException.class) . しかし、アプローチAを使用した場合、どのように例外をテストするのでしょうか?
  3. アプローチAを使用する場合、いくつかのテストクラスをこのようにテストスイートにまとめることができます。

    TestSuite suite = new TestSuite("All tests");

    suite.addTestSuite(DummyTestA.class);

    suite.addTestSuite(DummyTestAbis.class);



    しかし、これはアプローチ B では使用できません (各テストクラスは TestCase をサブクラス化する必要があるからです)。 アプローチBのテストをグループ化する適切な方法は何ですか?

編集:両方のアプローチにJUnitのバージョンを追加しました。

解決方法は?

区別は簡単です。

  • 拡張 TestCase は、JUnit 3 でユニットテストが書かれた方法です(もちろん、JUnit 4 でもサポートされています)。
  • を使用しています。 @Test アノテーションは、JUnit 4で導入された方法です。

JUnit 3(および/またはJava 5より前のJavaバージョン)との互換性が必要な場合を除き、一般的にはアノテーションのパスを選択する必要があります。新しい方法には、いくつかの利点があります。

JUnit 3 で期待される例外をテストするには TestCase は、テキストを明示的にする必要がありますね。

public void testMyException() {
  try {
    objectUnderTest.myMethod(EVIL_ARGUMENT);
    fail("myMethod did not throw an Exception!");
  } catch (MyException e) {
    // ok!
    // check for properties of exception here, if desired
  }
}

JUnit 5 は、さらに別のAPIの変更を導入しましたが、依然としてアノテーションを使用しています。新しい @Test アノテーションは org.junit.jupiter.api.Test (古いJUnit 4のものは、quot;old") org.junit.Test ) が、JUnit 4 のものとほとんど同じように動作します。