2016-04-13 5 views
0

私はJava8を使用していますが、特定のタイプの例外がスローされたことを検証するテストヘルパーを作成しようとしています。私がやりたいのは何メソッドは引数には適用されません。例外タイプの消去に問題がありますか?

private static <E extends Exception> void expectThrow(Callable<Void> callable, Class<E> exceptionClass) { 
    try { 
     callable.call(); 
    } catch (Exception e) { 
     assertTrue(exceptionClass.isInstance(e)); 
    } 
} 

私は障害からより有用情報を得るようhamcrest照合とcatchブロックを置き換えるある:ここで働く最初のバージョンです

 assertThat(e, Matchers.isA(exceptionClass)); 

が、これは」doesnのtコンパイル - 私はこの素敵なエラーを受け取ります:The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (Exception, Matcher<E>)

これは困惑します。

Integer a = 3; 
    assertThat(a, Matchers.isA(Number.class)); 

多少いじった後、次のようにも動作します:

 assertThat((E)e, Matchers.isA(exceptionClass)); 

それは私のEへの例外から役立つ」未チェックのキャストを提供しますが、これは完全に正常に動作し、以下の場合に類似と思われます"タイプセーフティ警告。私は知りませんcatch (E e) - 型消去とすべて...

何が起こっているのですか?テストヘルパーを素早くタイプセーフな方法で更新するにはどうすればよいですか?

答えて

0

これは最終的に5日前にlong-standing issueと表示されたようです。 isAの署名が壊れています。 Hamcrestの次のリリースは、修正プログラムが利用可能になり、そして、あなたのプロジェクトは、そのリリースを使用するまで、あなたは

assertThat(e, is(instanceOf(exceptionClass))) 
+0

Daaaangを使用する必要がありますまでは...それはそれは長い間の周り立ち往生ちょっと面白いです! – Krease

関連する問題