2016-05-25 20 views
4

JUnitでは、TestWatcherを使用してfailed()関数をオーバーライドすると、スローされた例外を削除して、自分のアサーションを作成することは可能ですか?JUnit TestWatcher:失敗しました。スローされた例外(Throwable/stacktraceの操作)を削除できますか?

ユースケースがある:テストはアプリのクラッシュを作るアンドロイド、上の機能テストで、私はてAssertionError(「アプリがクラッシュした」)とはNoSuchElementExceptionを交換したいと思います。

finished()メソッドでクラッシュを検出したときにカスタムアサーションを作成するのに問題はありませんが、スローされた例外を削除するにはどうすればよいですか?

私のレポートでは、1つのテストで例外とアサーションが作成されるため、テストでは失敗よりも多くの失敗があります。これはロジックですが迷惑です。

StackTraceを操作して特定のNoSuchElementExceptionを削除するためにThrowableオブジェクトをカスタマイズする方法があるのだろうかと思っていました。

私はそれをすることはできませんでした。 (そして、必ずしもすべてのテストでtry/catchを使って実行する必要はありません...)。

答えて

3

あなたはTestWatcher.applyをオーバーライドしてNoSuchElementExceptionのための特別なcatchを追加することができます。

public class MyTestWatcher extends TestWatcher { 
    public Statement apply(final Statement base, final Description description) { 
     return new Statement() { 
      @Override 
      public void evaluate() throws Throwable { 
       List<Throwable> errors = new ArrayList<Throwable>(); 

       startingQuietly(description, errors); 
       try { 
        base.evaluate(); 
        succeededQuietly(description, errors); 
       } 
       catch (NoSuchElementException e) { 
        // ignore this 
       } 
       catch (AssumptionViolatedException e) { 
        errors.add(e); 
        skippedQuietly(e, description, errors); 
       } 
       catch (Throwable e) { 
        errors.add(e); 
        failedQuietly(e, description, errors); 
       } 
       finally { 
        finishedQuietly(description, errors); 
       } 

       MultipleFailureException.assertEmpty(errors); 
      } 
     }; 
    } 
+0

まさに私が欲しかったこと、ありがとう:) – Fanch

1

あなたはバイパスしてそれを行うことができます。コード例を以下に示します。それがあなたを助けることを願っています。

try { 
// Write your code which throws exception 
---- 
---- 
---- 

} catch (NoSuchElementException ex) { 
    ex.printStackTrace(); 
    if (ex instanceof NoSuchElementException) { // bypass 
               // NoSuchElementException 
     // You can again call the method and make a counter for deadlock 
     // situation or implement your own code according to your 
     // situation 
     AssertionError ("app crashed"); 
     if (retry) { 
      --- 
      --- 
      return previousMethod(arg1, arg2,...); 
     } else { 
      throw ex; 
     } 
    } 
} catch (final Exception e) { 
    e.printStackTrace(); 
    throw e; 
} 

私はこれまでにこの種の問題を解決しました。私のもう一つの答えには詳細がある。あなたは私の別の答えを調べることができます:android.security.KeyStoreException: Invalid key blob

関連する問題