1.はじめに
JUnitのテストを書いている中で、サービスクラスは何を確認しているのかwhenとverifyはどういう違いがあるのかを理解するために記事を書いていければと思います。
間違い等ございましたら、ご指摘いただけますと幸いです。
2.Serviceクラスの単体テスト
Serviceクラスでは何を確認すればよいのかという疑問について解消できればと思います。
Serviceクラスのテストで確認することとしては下記になるようです。
<メソッドの結果は正しいか>
サービスクラスのメソッドが正しい値を返しているかを確認します
簡単な例でいくと計算結果が正しいかどうかなど ↓
@Test
void testCalculateTotal() {
int total = service.calculateTotal(10, 20);
assertEquals(30, total);
}
<依存するクラスとのやり取りが正しいか>
・サービスクラスが他のクラス(リポジトリや他のサービスクラス)に依存している場合そのクラスへの呼びだしが正しく行われているかを確認します
・Mockitoなどのモックライブラリを使って、依存クラスの動作をシミュレーションし、正しいメソッドが呼ばれているかを確認します(Mockについての解説)
@Test
void testSaveUser() {
User user = new User(1, "John");
// リポジトリの保存メソッドが呼ばれることを確認
service.saveUser(user);
verify(userRepository, times(1)).save(user);
}
<エッジケースや異常系の動作>
・異常な入力やエッジケースに対するサービスクラスの動作を確認します
・例えば空のリストやnull値、範囲外の数値を渡したときの処理の動作が正しいかなど
@Test
void testFindUserNotFound() {
when(userRepository.findById(999)).thenReturn(Optional.empty());
// 存在しないユーザーIDを渡したときの挙動
assertThrows(UserNotFoundException.class, () -> {
service.findUserById(999);
});
}
などがあります。
その中でよく使われているwhenとverifyは何をしているのかについてのも調べていければと思います。
3.whenとかverifyって何?
JUnitを書いていると、whenとverifyを多く使用しているのでこれらは何をしているのかを詳しく理解できればと思います。
when
役割:特定のメソッドが呼ばれたときにその戻り値を定義します
when(userService.findById(1)).thenReturn(new User());
これは userService.findById(1) を呼び出したとき、モックオブジェクトが新しい User オブジェクトを返すことを指定しています。
verify
役割:テスト中に特定のメソッドが何回呼び出されたか、または特定の引数で呼び出されたかを検証します
verify(userService, times(1)).findById(1);
簡単にまとめると
when: モックが特定の条件に応じて返す値を設定する。
verify: モックが期待通りの方法で使用されたかを検証する。
ようです。
4.まとめ
まだ簡単なJUnitしか書いたことがないのですが、今自分が何をテストで確認すればよいかの基礎は理解できてよかったです。