【Spring Boot】DI とテスト(@MockBean)の基本をやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Boot でテストを書いていると、
@MockBean というアノテーションを目にすることがあります。

「Mock と DI はどう関係しているの?」
「Service のテストで Repository をどう扱えばいい?」
「Controller のテストで外部 API を呼びたくない…」

そんな悩みを解決してくれるのが
DI と @MockBean の組み合わせ です。

この記事では、DI とテストの関係を
やさしく・実務で役立つ形 で整理していきます。

まずはコードを見て、そこから少しずつ理解していきましょう。

まずはコードを確認

Service のテスト例

Java
@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 のテストでも使える

Java
@MockBean
private UserService userService;

Controller のテストで
Service を Mock にできます。

外部 API を呼ばないテストが書ける

外部 API クライアントを Mock にすれば、
ネットワークに依存しないテストが書けます。

DB に依存しないテストが書ける

Repository を Mock にすれば、
DB を用意しなくてもテストできます。

あわせて知っておきたいポイント

@Mock と @MockBean の違い

アノテーション役割
@Mock純粋な Mockito の Mock。DI されない
@MockBeanSpring のコンテナに Mock を登録する

Spring Boot のテストでは
@MockBean を使うのが基本 です。

@SpyBean もある

部分的に本物の動きを残したいときは

Java
@SpyBean

が使えます。

@WebMvcTest と相性が良い

Controller のテストでは

Java
@WebMvcTest

と組み合わせるのが定番です。

使うときに気をつけたいこと

Mock の戻り値を設定し忘れない

Java
when(repository.findById(1L)).thenReturn(...);

を忘れると null が返ってきます。

Mock しすぎない

Mock が多すぎると
「何をテストしているのか」
わからなくなります。

統合テストでは @MockBean を使わない

本物の DB や外部 API を使うテストでは
Mock は不要です。

まとめ

DI と @MockBean は、
「テスト時に依存を差し替えるための仕組み」
です。

  • DI があるから Mock を注入できる
  • @MockBean はコンテナに Mock を登録する
  • Repository や外部 API を簡単に偽物にできる
  • Controller / Service のテストが書きやすくなる

難しく聞こえますが、
「テストしたいクラスだけに集中するための仕組み」
と理解できれば十分です。


decopon
decopon

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

moco
moco

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

コメント

タイトルとURLをコピーしました