たなかのJava日記

どんなことをやったか(学んだか)、どこで詰まったか(わからなかったか)、どこで工夫したかの記録です。

アサーションメソッドの種類

前回は実行結果が期待した値と等しいことを確認する、
assertEqualsメソッドを実施しました。
アサーションメソッドは他にも種類がたくさんあります。
今回はassertEquals以外の代表的なアサーションメソッドを確認します。

■代表的なアサーションメソッド
assertEquals(期待値, 式 [, メッセージ])
 ⇒式が期待値と一致することを確認する

assertNotEquals(期待値, 式 [, メッセージ])
 ⇒式が期待値と異なることを確認する

assertTrue(式 [, メッセージ])
 ⇒式がtrueを返すことを確認する

assertFalse(式 [, メッセージ])
 ⇒式がfalseを返すことを確認する

assertNull(式 [, メッセージ])
 ⇒式nullを返すことを確認する

assertNotNull(式 [, メッセージ])
 ⇒式がnullを返さないことを確認する

assertThrows(例外クラス, ラムダ式[, メッセージ])
 ⇒式が例外を投げることを確認する※Junit5から導入

assertDoseNotThrow(ラムダ式[, メッセージ])
 ⇒式が例外を投げないことを確認する※Junit5から導入

assertAll(ラムダ式...)
 ⇒複数のテストをすべて実行する※Junit5から導入

※Junit5から導入された新しいアサーションメソッドは、
引数、戻り値を持たないラムダ式を書きます。

■例外NumberFormatExceptionが投げられることを期待するテスト
assertThrows(NumberFormatException.class, () -> Integer.parseInt("¥10,000"),
                        "¥や,が入っているのでパース出来ない");

■例外が投げられないことを期待するテスト
assertDoesNotThrow(() -> new Calc().add(-100, 10),
                        "負の値を渡しても例外が出ない");

■複数のアサーションメソッドを必ず実行するテスト
通常、アサーションメソッドで失敗するとそこでテストメソッドの実行は終了します。
テストメソッド内でに複数アサーションメソッドメソッドが並んでいる場合、
一番最初に失敗するアサーションメソッドしか確認ができません。
assertAllメソッドを使えば、アサーションメソッドを含むラムダ式を複数記述できます。
ラムダ式はすべて実行され、失敗したラムダ式の一覧が報告されます。
似たテスト項目を列挙するときに使うとよいです。

以下はテストメソッド内に複数のアサーションメソッドを記載した例です。
※本当は例外は別のメソッドでやるべきです。
サンプルとして1メソッド内に複数のアサーションメソッドを記載しています。

package test;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CalcTest {

    @Test
    void add() {
        assertAll(
                () -> assertThrows(NumberFormatException.class, () -> Integer.parseInt("¥10,000"),
                        "¥や,が入っているのでパース出来ない"),
                () -> assertDoesNotThrow(() -> new Calc().add(-100, 10),
                        "負の値を渡しても例外が出ない"),
                () -> assertEquals(4, new Calc().add(2,2), "2 + 2 = 4"),
                () -> assertEquals(6, new Calc().add(2,4), "2 + 4 = 8")
        );
    }
}