LoginSignup
0
0

More than 3 years have passed since last update.

【SpringBoot】スコープ外でAutowireされる内容をMock化する【JUnit5】

Posted at

背景

@Autowiredを用いるようなCustomValidatorが絡む内容をテストするため、BeanMock化します。

やり方

実装は以下の通りです、解説はそれぞれコメントを参照してください。

// この2つを付ければ@RunWith(MockitoJUnitRunner.class)やrule類のアレコレは不要
@ExtendWith(SpringExtension.class)
@SpringBootTest
class HogeTest {
    // BeanをMock化、このインスタンスがinjectされる
    @MockBean FugaDao fugaDao;

    @Test
    @DisplayName("Daoから取得できなかった場合")
    void isEmpty() {
        // mockに対する設定方法は通常のMockitoを用いる時と同じ
        when(fugaDao.selectFuga(anyInt())).thenReturn(Optional.empty());

        /* 実際のバリデーションについては省略 */

    }
}

補足

以下このやり方に関する補足です。

1

コンストラクタに入力できるなど、自分でインスタンス内容に関与可能な内容については、余程の事情が無ければ直接Mock化してテストした方がいいです。

2

本来具体的なクラスのテストがCustomValidatorの実装に左右されるのはおかしいため、CustomValidatorMock化する方がよいです。
これについては、調べた限りだとざっくり以下のやり方を見つけました。

  • リフレクションを用い、CustomValidatorMockに差し替える
  • JMockitoPower Mockを用い、「そのクラスのインスタンス全てをMock化する」ようにする

この記事では諸事情によりどちらの方法も用いないこととしたため、BeanMock化する方法でテストを行っています。

関連記事

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