テストケースのアサートの1つが失敗した場合でも実行を継続する機能を提供するJfuncを使用して既存のフレームワークを構築しています。 Jfuncはjunit 3.xフレームワークを使用します。しかし、現在junit4に移行しているため、Jfuncを使用できなくなり、junit 4.10 jarに置き換えました。
問題は、フレームワークでjfuncを広く使用しているためです。junit4では、テストケースでアサートの1つが失敗した場合でも、コードの実行を継続したいです。
誰もこれに対する提案/アイデアを持っていますか、私はjunitでテストをよりアトミックにする必要があることを知っています、つまりテストケースごとに1つアサートしますが、何らかの理由でフレームワークでそれを行うことはできません。
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));
}
_
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
}
}
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();
}
また、softly.assertAll()を手動で呼び出さずに使用する他の方法もあります。
Try/finallyブロックを使用します。これは私の場合でうまくいきました:
...
try {
assert(...)
} finally {
// code to be executed after assert
}
...
試行-キャッチ、「トライ」でアサーションを使用、「キャッチ」で可能性のあるエラーをコレクションに追加。その後、テストの最後に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();
}
}