59

テストケースのアサートの1つが失敗した場合でも実行を継続する機能を提供するJfuncを使用して既存のフレームワークを構築しました。Jfunc は、junit 3.x フレームワークを使用します。しかし、現在はjunit4に移行しているため、Jfuncを使用できなくなり、junit 4.10 jarに置き換えました。
ここでの問題は、フレームワークで jfunc を広く使用しているためです。junit 4 では、テスト ケースでアサートの 1 つが失敗した場合でも、コードを実行し続けたいと考えています。
誰かがこれについて何か提案/アイデアを持っていますか?私はjunitでテストをよりアトミックにする必要があることを知っています.つまり、テストケースごとに1つのアサートが必要ですが、何らかの理由でフレームワークでそれを行うことはできません.

4

7 に答える 7

75

これは、 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));
}
于 2012-04-19T05:12:31.090 に答える
22

ErrorCollectorも使用しますが、assertThatも使用して、trycatchブロックに配置します。

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
    }
}
于 2012-07-12T03:35:02.140 に答える
5

assertjも使用できます-ソフトアサーション

@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();
}

手動で softly.assertAll(); を呼び出さずに使用する他の方法もあります。

  1. ルールあり
  2. オートクローズ可能
  3. 静的 assertSoftly メソッドの使用
于 2016-12-20T13:00:24.763 に答える
3

try/finally ブロックを使用します。これは私の場合に機能しました:

...
try {
    assert(...)
} finally {
    // code to be executed after assert
}
...
于 2015-08-29T18:37:36.573 に答える
0

Try - キャッチ。「try」でアサーションを使用し、「catch」で考えられるエラーをコレクションに追加します。次に、テストの最後に、tearDown() で例外をスローします。したがって、アサートに失敗/エラーが発生した場合、それがキャッチされ、テストが続行されます。(例のコレクションは静的です。@Test ごとに setUp() で新しいインスタンスを作成することもできます)

    public static List<String> errors = new ArrayList<>();


    try {
        //some assert...
    }
    catch (AssertionError error) {
        errors.add(error.toString());
    }



    @After
    public void tearDown() {

        try {
            if (!errors.isEmpty()) {
                throw new AssertionError(errors);
            }
        }
        finally {
            //empty list because it's static, alternatively make instance for each test in setUp()
            errors.clear();
        }
    }
于 2018-11-20T08:46:19.080 に答える