はじめに
Spring Boot でテストを書いていると、
@MockBean というアノテーションを目にすることがあります。
「Mock と DI はどう関係しているの?」
「Service のテストで Repository をどう扱えばいい?」
「Controller のテストで外部 API を呼びたくない…」
そんな悩みを解決してくれるのが
DI と @MockBean の組み合わせ です。
この記事では、DI とテストの関係を
やさしく・実務で役立つ形 で整理していきます。
まずはコードを見て、そこから少しずつ理解していきましょう。
まずはコードを確認
Service のテスト例
@SpringBootTest
class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
void testFindUser() {
when(userRepository.findById(1L))
.thenReturn(Optional.of(new User("taro")));
User user = userService.findById(1L);
assertEquals("taro", user.getName());
}
}このように、
テスト時だけ Repository を Mock に差し替える
ことができます。
コードのしくみを解説
DI とテストの関係
DI(依存性注入)は、
「必要なオブジェクトを外から渡す仕組み」
でした。
テストではこの仕組みがとても役立ちます。
- 本物の Repository を使わない
- 外部 API を呼ばない
- DB に依存しない
- テストしたいクラスだけに集中できる
DI があるからこそ、
テスト時に依存を差し替える
ということが簡単にできます。
@MockBean とは
一言でいうと、
「Spring のコンテナに、Mock の Bean を登録するアノテーション」
です。
- 本物の Bean の代わりに
- Mock(Mockito の偽物オブジェクト)を
- Spring が自動で注入してくれる
という仕組みです。
@MockBean が便利な理由
DI の仕組みで自動的に差し替わる
Service が Repository を @Autowired していても、
テスト時は @MockBean の Repository が注入されます。
Controller のテストでも使える
@MockBean
private UserService userService;Controller のテストで
Service を Mock にできます。
外部 API を呼ばないテストが書ける
外部 API クライアントを Mock にすれば、
ネットワークに依存しないテストが書けます。
DB に依存しないテストが書ける
Repository を Mock にすれば、
DB を用意しなくてもテストできます。
あわせて知っておきたいポイント
@Mock と @MockBean の違い
| アノテーション | 役割 |
|---|---|
| @Mock | 純粋な Mockito の Mock。DI されない |
| @MockBean | Spring のコンテナに Mock を登録する |
Spring Boot のテストでは
@MockBean を使うのが基本 です。
@SpyBean もある
部分的に本物の動きを残したいときは
@SpyBeanが使えます。
@WebMvcTest と相性が良い
Controller のテストでは
@WebMvcTestと組み合わせるのが定番です。
使うときに気をつけたいこと
Mock の戻り値を設定し忘れない
when(repository.findById(1L)).thenReturn(...);を忘れると null が返ってきます。
Mock しすぎない
Mock が多すぎると
「何をテストしているのか」
わからなくなります。
統合テストでは @MockBean を使わない
本物の DB や外部 API を使うテストでは
Mock は不要です。
まとめ
DI と @MockBean は、
「テスト時に依存を差し替えるための仕組み」
です。
- DI があるから Mock を注入できる
- @MockBean はコンテナに Mock を登録する
- Repository や外部 API を簡単に偽物にできる
- Controller / Service のテストが書きやすくなる
難しく聞こえますが、
「テストしたいクラスだけに集中するための仕組み」
と理解できれば十分です。

DI とテストの関係を理解すると、
テストがぐっと書きやすくなり、
品質も安定します。
あなたの開発が、今日より少しだけ楽になりますように。

テストのときだけそっと入れ替わるなんて…DI さん、気がきくね。

コメント