背景
@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
化する方法でテストを行っています。