今回は、JUnitの基本的な使い方をご紹介していきたいと思います。Junitは単体テストとして実際の業務で使うことが多いので、テストクラスの作成方法から実際に動かして判定するところまでを初心者の方向けに解説していきたいと思います。
JUnitテストの作成方法
まずはJunitのテストケースを作成してみましょう。
「テストしたいクラスを右クリック」→「新規」→「その他」を選択します。
今回作成するのはJUnitなので、Java配下にあるJUnitの下にある「Junit テスト・ケース」を選択し「次へボタンをクリックします。
詳細設定を行う画面が出てくるので、完了ボタンを押下します。
※BeforeEach等のメソッドを選択すると最初から選択したメソッドが宣言された状態でテストクラスが作成されるので、必要な方はチェックを入れて作成すると便利です。
テスト対象のクラス名の後ろにTestが付いたクラスが作成されていればOKです。
それでは実際にテストケースを記載してみましょう!
JUnitを実際に動かしてみる
まずはJUnitを動かすための準備をします。
- テスト対象クラスを「@InjectMocks」で定義
- 「@InjectMocks」、「@Mock」等のアノテーション使用するためのAutoCloseableを定義
- 「@BeforeEach」でopen
- 「@AfterEach」でclose
これで準備は完了です!
それでは動かしてみましょう。今回はこちらのクラスを動かしていきたいと思います。
「テストクラスを右クリック」→「実行」→「JUnitテスト」を押下します。
実行すると画像のようになり、成功すると緑色、失敗すると赤色になります。
このやり方はテストクラスのすべてのテストを実行していますが、テストメソッドを右クリックして同様に実行するとメソッド単位でテストを行うことができます。
また、カバレッジから実行することで、実行箇所が緑色になり網羅性を確認することができます。企業などではカバレッジを100パーセントを基準に単体テストを実施することもあるので、覚えておくと便利です。
もちろんデバッグで実行すれば指定した箇所で止めて値を確認できたりもします。
さて、準備は整ったので、次は様々なパターンで使えるJUnitの便利機能を紹介していきたいと思います。
モック化のやり方
モック化のやり方は自クラスと他クラスで方法が異なります。
自クラスのモック化
- 「@InjectMocks」している自クラスの定義に「@Spy」を追加する ※@Spyをつけるとデバッグが反応しなくなるため注意です。
他クラスのモック化
- 呼び出し先クラスを「@Mock」で定義
よく使うJUnit単体テスト確認方法まとめ
メソッドが呼ばれたかどうかを確認する「verify」
「verify」を使うと、対象のメソッドが何回呼ばれたかを確認することができます。
呼ばれてほしいメソッドが正しく呼ばれているか確認するために用います。
// メソッドが1回呼ばれていることの確認
Mockito.verify(yobidasisaki, times(1)).yobidasisaki();
呼ばれてはいけないメソッドがある場合の確認は、timse(0)にすることで確認できます。
戻り値を設定する「do~」
呼び出すメソッドの戻り値を設定するには「do~」シリーズを使います。
do~にはいくつか種類がありますが、ここではよく使われるものを3つ紹介します。
・doReturn
戻り値に値を設定して返却することができます。
ただし、戻り値の型は実際の型と合わせる必要があるので注意です。
// 指定した戻り値を返す「doReturn」
Mockito.doReturn("戻り値").when(yobidasisaki).modoritiari();
・doNothing
戻り値がないメソッドに記述します。
呼び出し先メソッドがテスト対象外の場合によく使用します。
// 戻り値がない(voidメソッド)の「doNothing」
Mockito.doNothing().when(yobidasisaki).modoritinasi();
・doThrow
戻り値に例外を発出させます。例外処理の確認に使用します。
// 戻り値に例外を返す場合は「doThrow」
Mockito.doThrow(new Exception()).when(yobidasisaki).modoritinasidemoka();
メソッドに渡す引数の値を確認する「ArgumentCaptor」
テストメソッド内で別メソッドを呼び出す際に渡す引数の内容を確認したい場合に用います。
// テストメソッド実行
junitSample.sample();
// メソッドに渡す引数の確認
ArgumentCaptor<String> stringCaptor = ArgumentCaptor.forClass(String.class);
// 呼び出し先メソッドの引数にcaptorを設定
Mockito.verify(yobidasisaki).yobidasisaki(stringCaptor.capture());
// captorから値を取得
String result = stringCaptor.getValue();
上記ソースでは「yobidasisaki」メソッドの引数のStringを取得しています。
同じメソッドが複数呼ばれている場合、以下のように記述することもできます。
// テストメソッド実行
junitSample.sample();
// メソッドに渡す引数の確認
ArgumentCaptor<String> stringCaptor = ArgumentCaptor.forClass(String.class);
// 呼び出し先メソッドの引数にcaptorを設定
Mockito.verify(yobidasisaki, times(2)).yobidasisaki(stringCaptor.capture());
// captorから値を取得
List<String> resultList = stringCaptor.getAllValues();
呼ばれる回数をtimesに記述し、Captorの「getAllValues()」で取得します。
この時、呼ばれた順番でListに詰められて取得できるので、取り出して確認することができます。
結果を判定する「assert」
テスト対象のメソッドの戻り値やcaptureした値が正しい値か判定するには、assertを使って判定します。
・assertEquals
assertEqualsは一致する場合に成功、一致しない場合に失敗となります。
第1引数に期待値、第2引数にテスト値を記述します。
// resultの値が5と等しいか判定
assertEquals(5, result);
// resultの値がtestと等しいか判定
assertEquals("test", result);
・assertThat
assertThatはとても便利で、ぶっちゃけこれさえ使えば単体テストは問題なく網羅できると思います。
第1引数にテスト値、第2引数に期待値を記述します。※assertEqualsと逆なので注意!
// resultの値がtestと等しいか判定
assertThat(result, is("test"));
// 5が1より大きいか判定
assertThat(5, greaterThan(1));
// resultの値が6以外か判定
assertThat(result, not(6));
このように、期待値に様々な成功条件を記述することができるので便利です。
・assertNull
assertNullは見た目の通りNullであるかどうかを判定してくれます。
また、assertNotNullもありNullでないかを判定することもできます。
// resultがNullか判定
assertNull(result);
// resultがNullでないか判定
assertNotNull(result);
ほかにも沢山のassertが存在しますが、最低限これだけ覚えていれば問題ないと思います!
以上、JUnitのテストクラスの作り方から実際に動かして判定するところまでを解説してみました。
少しでも参考になれば幸いです!