2016-07-19 9 views
0

Android Studioを使用すると、スレッドを使用するコードをテストするときに、例外がスローされることを確認する優れた解決策が見つかりました。テスト中のスレッドでUncaughtExceptionHandlerを使用し、join()を使用してこのスレッドが終了するのを待ちます。別のスレッドでのカバレッジ付きのJunit例外

通常のテストでも、デバッグでも完璧に動作します。カバレッジ付きで実行すると問題が発生します。UncaughtExceptionHandlerはスローされた例外と呼ばれることはありません。そのため、例外が発生すると予想されるためテストが失敗します。

私が持っている仮説の1つは、スレッドがチェックされていない例外(つまり、どこか他の場所でキャッチされない)をスローしないように実行されているということです。しかし、これを検証したり、私は同時にカバレッジをデバッグして実行することはできません。

答えて

0

他のスレッドからアサーションを実行するには、ConcurrentUnitをチェックしてください。これは、メインスレッドがメインとなる間に任意のスレッドでアサーションを実行できるWaiterを提供します。予想通り、任意のアサーションの失敗は、テストが失敗する原因:アンドロイドテストは、私はシッククライアントJavaでに慣れている同じJUnitのAPIを使用している場合

Waiter waiter = new Waiter(); 

new Thread(() -> { 
    waiter.assertEquals(foo, bar); 
    waiter.resume(); 
}).start(); 

// Wait for resume or an assertion failure 
waiter.await(); 
0

が、私はわからないんだけど、私はを使用したいですErrorCollector TestRuleを使用してオフスレッドのプロセス例外をメインテストスレッドに戻し、ExpectedExceptionを実行して、例外タイプ、メッセージ、および/または原因を確認します。

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ErrorCollector; 
import org.junit.rules.ExpectedException; 

public class ThreadExceptionTest { 
    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 
    @Rule 
    public ExpectedException exEx = ExpectedException.none(); 

    @Test 
    public void doThreadTestFail() throws Exception { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       try { 
        throw new RuntimeException("drat"); 
       } catch (Exception ex) { 
        collector.addError(ex); 
       } 
      } 
     }; 
     Thread th = new Thread(r); 
     th.start(); 
     th.join(); 

    } 

    @Test 
    public void doThreadTestPass() throws Exception { 
     exEx.expect(RuntimeException.class); 
     exEx.expectMessage("drat"); 

     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       try { 
        throw new RuntimeException("drat"); 
       } catch (Exception ex) { 
        collector.addError(ex); 
       } 
      } 
     }; 
     Thread th = new Thread(r); 
     th.start(); 
     th.join(); 

    } 
} 
関連する問題