JavaのMockitoによるモックテスト入門

先生

Javaのテストが楽になる!Mockitoで依存関係を断ち切って、自信を持ってコードを書こう!

Mockitoとは?Javaのテストを強力にするモックフレームワーク

Mockitoは、Javaのユニットテストを簡単にするためのモックフレームワークです。依存関係を持つクラスのテストを行う際に、実際の依存オブジェクトの代わりにモックオブジェクトを使用することで、テスト対象のクラスの動作に集中できます。これにより、テストの独立性、再現性、速度が向上します。

モックとは、本物のオブジェクトの代わりとなる、振る舞いを制御できるオブジェクトのことです。Mockitoを使うと、モックオブジェクトに対して、メソッドが呼ばれたときの戻り値や例外を事前に設定できます。また、メソッドが期待通りに呼ばれたかどうかを検証することも可能です。

Mockitoの基本的な使い方:導入から簡単なテストまで

Mockitoを使い始めるには、まずプロジェクトにMockitoのライブラリを追加する必要があります。Mavenを使用している場合は、pom.xmlに以下の依存関係を追加します。

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>5.3.1</version> <!-- 最新バージョンを確認してください -->
    <scope>test</scope>
</dependency>

Gradleを使用している場合は、build.gradleに以下の依存関係を追加します。

dependencies {
    testImplementation 'org.mockito:mockito-core:5.3.1' // 最新バージョンを確認してください
}

Mockitoの基本的なアノテーションには@Mock@InjectMocks@Spyがあります。@Mockはモックオブジェクトを作成するために使用し、@InjectMocksはモックオブジェクトを注入するクラスを指定します。@Spyは一部だけモック化したい場合に利用します。

簡単なテスト例を見てみましょう。

import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;

import static org.junit.jupiter.api.Assertions.assertEquals;

@ExtendWith(MockitoExtension.class)
class ExampleTest {

    @Mock
    MyDependency dependency;

    @Test
    void testMyMethod() {
        // モックの振る舞いを定義
        Mockito.when(dependency.getValue()).thenReturn(10);

        // テスト対象のメソッドを実行
        int result = dependency.getValue() + 5;

        // 結果を検証
        assertEquals(15, result);
    }
}

この例では、MyDependencyというクラスのgetValue()メソッドが呼ばれたときに、常に10を返すようにMockitoで設定しています。このように、依存関係を持つクラスの動作をモックすることで、テスト対象のクラスのロジックに集中してテストできます。

Mockitoを使ったより実践的なテストケース

Mockitoは、より複雑なシナリオでも役立ちます。例えば、voidメソッドの呼び出しを検証したり、例外がスローされることをシミュレートしたりできます。

voidメソッドの呼び出しを検証する例:

import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(MockitoExtension.class)
class VoidMethodTest {

    @Mock
    MyService service;

    @Test
    void testMyVoidMethod() {
        // テスト対象のメソッドを実行
        service.myVoidMethod("test");

        // メソッドが呼ばれたことを検証
        Mockito.verify(service).myVoidMethod("test");
    }
}

この例では、myVoidMethodが引数”test”で呼ばれたことをMockito.verify()で検証しています。

例外をスローするシミュレーション例:

import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;

import static org.junit.jupiter.api.Assertions.assertThrows;

@ExtendWith(MockitoExtension.class)
class ExceptionTest {

    @Mock
    MyService service;

    @Test
    void testMyMethodThrowsException() {
        // 例外がスローされることをモック
        Mockito.when(service.myMethod()).thenThrow(new RuntimeException("テスト例外"));

        // 例外がスローされることを検証
        assertThrows(RuntimeException.class, () -> service.myMethod());
    }
}

この例では、myMethod()が呼ばれたときにRuntimeExceptionがスローされるようにMockitoで設定し、assertThrows()で例外が正しくスローされることを検証しています。

参考リンク

まとめ

Mockitoは、Javaのユニットテストをより効果的に行うための強力なツールです。モックオブジェクトを使用することで、依存関係を気にせずにテスト対象のクラスの振る舞いを検証できます。Mockitoを使いこなして、より堅牢で信頼性の高いアプリケーションを開発しましょう。