Junit5 でよく使うAssertionをまとめる
現在はテスト駆動開発で開発を進めていますが、テストのアサーションがぱっと出てこないことがあるので、よく使うassertionをまとめます。
こちらは、Javaの初心者向けの記事です。Junit5でassertionを利用する場合、メソッドはstaticインポートをする必要がありimport static org.junit.jupiter.api.Assertions.*;
のようにインポートが記載されている必要があります。
*
は使用するメソッドへ置き換えるか、*
で全件インポートされるかのいずれかです。
記事に書かれている以外のメソッドは公式ページを確認してください。
なお、よく使うアサーションを紹介する目的で書いているため、サンプルコードはテストコードとして意味のあるものではないことにご注意ください。
等しい値かどうかを検証するアサーション
assertEquals
は2つの値が等しいかどうかを検証するアサーションです。
使い方はassertEquals(expected, actual)
と指定し、期待する値(expected)と実際の値(actual)を比較します。
class EqualsTest(){
@Test
void test_equals_two_value(){
int actual = 2;
assertEquals(2, actual);
}
}
assertEqualsは非常によく使うメソッドです。期待した値が取れているかなど確認する際に使用します。
例えば、アプリケーション/データベースからのレスポンスが正しいかを確認することになります。
逆に2つの値が等しくないことを確認したい場合はassertNotEquals
を使用します。
Nullかどうかを検証するアサーション
assertNull
は値がNullであるかを検証するアサーションです。assertNotNull
はその逆で指定された値がNullでないことを検証するメソッドです。
使い方はどちらも同じでassertNull(target)/assertNotNull(target)
のようにNullかどうかを確認したい値を引数に指定します。
class NullTest{
@Test
void test_actual_is_null(){
var actual = null;
assertNull(actual);
}
@Test
void test_car_is_not_null(){
Car car = new Car("Toyota");
assertNotNull(car);
}
}
意図せぬ箇所に Null が存在するのは、好ましくないので、アプリケーションの設計側で Null安全なコードを目指すことが適切です。
ただし、テストでは意図せぬNullが発生しないことを確認する目的で使われることがあります。
テスト駆動開発であれば、まずテストをFailさせる必要があるので、その時に使われることもあります。
真偽値を検証するアサーション
assertTrue / assertFalseは引数に指定した値が true/falseのどちらであるかを確認するアサーションです。
class BooleanTest{
@Test
void test_is_true(){
boolean isChild = true;
assertTrue(isChild);
}
@Test
void test_is_false(){
boolean isChild = false;
assertFalse(isChild);
}
}
例えば、条件においてメソッドを実行した結果が true になるという処理を確認したい時や特定の設定を無効にしているかを確認する際などに利用することがあります。
例外を検証するアサーション
assertThrowsは例外がスローされるかどうかを検証します。 assertDoesNotThrowは例外がスローされないかを検証します。
使い方はassertThrows(例外クラス, テスト対象コードブロック)
のように指定します。テスト対象のコードブロックを実行した時に例外クラスが発生するかどうかを確認するメソッドです。
assertNotThrows
はその逆の意味になります。
class ThrowsTest(){
@Test
void test_NullPointerException(){
Person person = null;
assertThrows(NullpointerException.class, () -> {
person.getName(); // Exceptionがスローされる
});
}
@Test
void test_not_NullPointerException(){
Person person = new Person("MyName");
assertNotThrows(NullpointerException.class, () -> {
person.getName();
});
}
}
例外処理が機能しているかを確認する際に利用するアサーションです。主に例外ハンドリングの実装をする時に使うことになります。
また、予期せぬ例外が発生した際のトラブルシューティングでも使うことがあるはずです。
問題が発生した時には、まずその問題の再現をしてみるが解決に至る方法ですので、このアサーションも非常に重要です。
複数要素を同時に検証するアサーション
assertAllは複数のアサーションを同時に検証するものです。
これに関してはサンプルコードをみた方が使い方のイメージがつくはずなので早速確認してみてください。
class multipleAssertionTest(){
@Test
void testStudentsName(){
assertAll("student",
() -> assertEquals("山田隆", student.getName()),
() -> assertEquals("田中太郎", student.getName())
);
}
}
assertAllの使い所としては複数のアサーションを一度に実行して確認したい場合です。
個人的には、これまでに紹介したものと比べると利用頻度は下がると考えていますが、使い所としてはありうるので紹介しておきます。
まとめ
Junit5 でよく使うアサーションだけを紹介しました。他にもアサーション自体はありますが、実際に使いどころとして多いのはこの記事で紹介したものです。
とはいえ、実際のところ難しいのは何をテストすべきかというテスト設計のところだと思うので、そのあたりは追い追いわかりやすくまとめられたらと思います。
Discussion