[解決済み] JUnitの混乱:'extends TestCase'を使うか'@Test'を使うか?
質問
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の質問 :
さて、私の質問です。
- 望ましいアプローチとは また、どのような場合にどちらかを使うのでしょうか?
-
アプローチBでは、以下のように@Testアノテーションを拡張することで、例外に対するテストが可能になります。
@Test(expected = ArithmeticException.class)
. しかし、アプローチAを使用した場合、どのように例外をテストするのでしょうか? -
アプローチ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バージョン)との互換性が必要な場合を除き、一般的にはアノテーションのパスを選択する必要があります。新しい方法には、いくつかの利点があります。
-
は
@Test
アノテーション はより明示的で、ツールでのサポートが容易です (たとえば、この方法ですべてのテストを検索するのは簡単です)。 -
複数のメソッドにアノテーションを付けることができます。
@Before
/@BeforeClass
と@After
/@AfterClass
より柔軟な対応が可能 -
をサポートします。
@Rule
アノテーション などでExpectedException
-
をサポートします。
@Ignored
アノテーション -
を使用した代替テストランナーのサポート
@RunWith
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 のものとほとんど同じように動作します。
関連
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] JUnit 4で条件付きでテストを無視する
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】System.out.println()のJUnitテスト)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ファインバグタイプ
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
Methodのinvokeメソッド実装のJavaリフレクション
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
IDEA パッケージステートメントの欠落
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。