背景
@Autowiredを用いるようなCustomValidatorが絡む内容をテストするため、BeanをMock化します。
やり方
実装は以下の通りです、解説はそれぞれコメントを参照してください。
// この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の実装に左右されるのはおかしいため、CustomValidatorをMock化する方がよいです。
これについては、調べた限りだとざっくり以下のやり方を見つけました。
- リフレクションを用い、
CustomValidatorをMockに差し替える -
JMockitoやPower Mockを用い、「そのクラスのインスタンス全てをMock化する」ようにする
この記事では諸事情によりどちらの方法も用いないこととしたため、BeanをMock化する方法でテストを行っています。