6

JUnit を使用して、単体テストを持たないレガシー コードの高レベル テストを作成しています。

このコードの多くは、NullPointerExceptions のようなさまざまな未チェックの例外を "飲み込んで" います (たとえば、スタック トレースを出力して null を返すだけです)。したがって、単体テストは、下位レベルのコードのさまざまなポイントで一連の災害があっても通過できます。

飲み込まれたとしても、最初のチェックされていない例外でテストを失敗させる方法はありますか?

私が考えることができる唯一の代替手段は、System.err をリダイレクトし、例外の出力を分析するカスタム JUnit ラッパーを作成することです。

4

6 に答える 6

4

IDE のデバッガーでテストを実行すると、例外がスローされたときに IDE が中断するように構成できます。

于 2010-05-06T17:17:28.100 に答える
4

具体的な解決策がないため、私の答えはかなり一般的です。

このようなコードの臭い (例: 例外のスワリング) は、レガシー システムのバグ修正中に発生した場合に、段階的に (クラスごとに) クリーンアップするのが最適です。コード品質ツール (Findbugs、PMD、Checkstyle、さらには Sonar Quality Server など) は、それらを見つけるのに役立ちます。

飲み込まれた例外を自動的に「キャッチ」する方法は、AspectJ コンパイラを使用することです。特定のコード規約に違反した場合、IDE でコンパイル時エラーを生成するアスペクトを宣言できます。または、実行時にテスト対象のクラスを織り込み、AspectJ にそのような例外を再スローさせて、JUnit ランナーが記録できるようにすることもできます。

于 2010-05-06T17:28:49.830 に答える
1

AOP を使用して失敗をスローしようとします。このようなものが動作するはずです (注意してください、私はこれをテストしていません。AOP 注釈を使用するには、明らかに AspectJ セットアップが必要です)。

public class ClassUnderTest
{
   private static Boolean exceptionThrown;


   @Before
   public void resetExceptionFlag()
   {
      ClassUnderTest.exceptionThrown = false;
   }

   @Test
   public void myTestMethod()
   {

      //....
      // My Test Exception Code
      //....

      assertFalse(ClassUnderTest.exceptionThrown);
   }

   @Aspect
   static class TestAspects
   {
      @Pointcut("handler(Exception)")
      public void intereceptAllExceptions(){}

      //This is Fully Qualified because of the conflict with the junit Before annotation above
      @org.aspectj.lang.annotation.Before("intereceptAllExceptions()")
      public void flagExceptionThrown()
      {
         ClassUnderTest.exceptionThrown = true;

  }

} }

于 2010-05-07T04:30:29.990 に答える
1

Exception は SDK ライブラリの単なる標準クラスだと思います。

それを抽出し、変更して、SDK の前のクラスパスのどこかに配置した場合、SDK のものを置き換える必要があると思います (そうでない場合は、「新しい」例外を SDK jar に戻すことができます)。

とにかく、新しい例外は、テスト フレームワークで読み取ることができる静的な値を設定できます。

最もエレガントなソリューションではないかもしれませんが、「魔法」は必要ありません

于 2010-05-06T17:44:42.200 に答える
0

おそらく、テストしようとしているコードを貼り付けることができます。ほとんどの場合、powermock や jmockit などの「リマッパー」テスト フレームワークを使用して、JVM でクラスローダー操作を操作する必要があります。ただし、テスト対象のクラスのサンプルは、必要なアプローチを決定するのに役立ちます。

于 2010-05-07T07:11:33.080 に答える
0

バイトコードを変更するモック フレームワークまたは AOP フレームワークを使用して、キャッチしたい例外をモックできる場合があります。コンストラクターを変更して、より致命的な例外をスローしたり、テスト コードにフラグを設定したりできると思います。

于 2010-05-06T17:30:21.800 に答える