LoginSignup
0
0

More than 3 years have passed since last update.

【Mockito】ランダム生成の文字列を使ったdo whileループを検証する

Posted at

問題

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のメソッド呼び出し回数によって返却値を変更する方法

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0