問題
Mockitoを使って単体テストを作成中
以下のようなコードのテストに悩んでいた…
- ユーザーIDを生成
- 既存ユーザとIDが重複していたら生成し直す
- 生成したIDでSELECTしてEntityが取得できた場合は重複しているとする。
private String generateUserID() {
String userId;
do {
// ランダム8桁の文字列を作成
userId = RandomUtil.getRandomString(8);
// 作成したuserIDが既に使用されてなければループを抜ける
} while (userRepository.findByUserId(userId) != null);
return userId;
}
Repository部をスタブ化してSELECTの戻り値を設定することでテストする。
// Entityが取得できるパターン
when(userRepository.findByUserId(anyString())).thenReturn(new FUserList());
// Entityが取得できないパターン
when(userRepository.findByUserId(anyString())).thenReturn(null);
この2つをテストできたらOK。
ん?
でもこれって、Entityが取得できるパターンは無限ループになる…
解決
調べると、こんな書き方ができました
// 一回目の関数呼び出しでは取得できて、二回目では取得できない。
when(userRepository.findByUserId(anyString())).thenReturn(new FUserList()).thenReturn(null);
これなら、取得できるパターンとできないパターン両方いっぺんにできるし無限ループにならないですね。
参考
Mockito (Mockito 3.2.4 API)
テックノート – Mockitoのメソッド呼び出し回数によって返却値を変更する方法