2012-04-19 42 views
32

テストケース内のアサートの1つが失敗した場合でもエクセッションを継続する機能を提供するJfuncを使用して既存のフレームワークを構築しました。 Jfuncは、junit 3.xフレームワークを使用します。しかし今、私たちはjunit4に移行していますので、Jfuncをもう使用することはできず、junit 4.10 jarに置き換えました。
問題は、私たちのフレームワークでjfuncを広く使用し、テストケースでassertの1つが失敗した場合でもjunit 4でコードを実行し続けるようにしたいからです。
誰もがこれについて何か示唆を持っていますか?私はjunitでテストがより細かく、つまりテストケースごとに1つのアサートを必要とすることを知っていますが、何らかの理由で私たちのフレームワークでそれを行うことはできません。アサートの1つが失敗した場合でもjunit4でテストを継続します

答えて

41

ErrorCollectorルールを使用してこれを行うことができます。

public class MyTest { 
    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    //...tests... 
} 

次に、あなたがcollector.checkThat(...)への呼び出しでアサート置き換える:最初のテストクラスのフィールドとしてのルールを追加し、それを使用する

@Test 
public void myTest() { 
    collector.checkThat("a", equalTo("b")); 
    collector.checkThat(1, equalTo(2)); 
} 
+1

感謝。 最初の障害(すなわちcollector.checkThat(10、CoreMatchers.equalTo(11)))の後に動作し続けます。 しかし問題は、チェックの1つが失敗したとしてもテストが失敗とマークしたいということです。 上記のテストを実行した後、テストは合格とマークされます。私はそれが失敗し、スタックラインを失敗ラインに表示したい(アサーションが失敗したときと同様のもの)。 – user85

+0

それは変です。私はちょうど私の答えで書いたコードを試して、それは期待どおりに働いた。テストは失敗し、失敗した各アサーションのスタックトレースが出力されます。ここでは、完全なテストコードと私が得た出力をIntelliJからテストを実行しています:https://gist.github.com/2419626 –

+0

ああ...私の悪い、私はルールを追加することを忘れて、カオス.....混乱のために申し訳ありませんとポストのための多くのTHX。 – user85

8

私はErrorCollectorも使用しますが、assertThatも使用してtry catchブロックに配置します。

import static org.junit.Assert.*; 
import static org.hamcrest.Matchers.*; 

@Rule 
public ErrorCollector collector = new ErrorCollector(); 

@Test 
public void calculatedValueShouldEqualExpected() { 
    try { 
     assertThat(calculatedValue(), is(expected)); 
    } catch (Throwable t) { 
     collector.addError(t); 
     // do something 
    } 
} 
0

try/finallyブロックを使用してください。これは、私の場合で働いていた:また、手動でもsoftly.assertAll()を呼び出すことなく、それを使用する他の方法は存在しassertj - soft assertion

@Test 
public void testCollectErrors(){ 
    SoftAssertions softly = new SoftAssertions(); 
    softly.assertThat(true).isFalse(); 
    softly.assertThat(false).isTrue(); 
    // Don't forget to call SoftAssertions global verification ! 
    softly.assertAll(); 
} 

を使用することができます

... 
try { 
    assert(...) 
} finally { 
    // code to be executed after assert 
} 
... 
+1

あなたはこの質問が2年前に掲載されたことを実感しましたが、すでに受け入れられた答えがありますか? –

+4

@TheJuniorProgrammerちょうど一般的な注意、このサイトは受け入れられた答えについてだけではありません。要点は、回答を検索するユーザーが問題の解決策を見つけるのを助けることです。時には問題を解決するための複数のアプローチがあり、ある人にとってはうまくいくものが別の人にとってうまくいかないこともあります。 – nomistic

+0

@nomistic fine、十分に真実。 –

関連する問題