Mockito でモックオブジェクトを作成して、単体テストをする方法を書いていきます。
バージョン
動作確認で使用した製品のバージョンは以下の通りです。
目次
- 依存関係の追加
- テスト対象クラス
- 手動でモックを作成
- アノテーションでモックを作成
- テストの実行
- 動作確認用の資源
1. 依存関係の追加
Maven のビルドファイルで、Mockito のライブラリを追加します。
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.1.1</version> <scope>test</scope> </dependency>
Gradle の場合は以下の通りです。
testImplementation 'org.mockito:mockito-core:5.1.1'
2. テスト対象クラス
今回は、以下のサービスクラスをテストします。
src/main/java/org/example/service/UserService.java
package org.example.service; import org.example.model.User; import org.example.repository.UserRepository; public class UserService { public UserRepository repository; public User find(Long id) { return repository.find(id); } }
テストでは、リポジトリのモックを作成します。
3. 手動でモックを作成
サービスクラスのテストで、手動でリポジトリのモックを作成する方法は以下の通りです。
src/test/java/org/example/service/ManualUserServiceTest.java
package org.example.service; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.example.model.User; import org.example.repository.UserRepository; import org.junit.jupiter.api.Test; class ManualUserServiceTest { private final UserService service = new UserService(); @Test void testFind() { // 準備 UserRepository repository = mock(UserRepository.class); when(repository.find(1L)).thenReturn(new User(1L, "鈴木")); service.repository = repository; // 実行 User result = service.find(1L); // 検証 assertEquals(1L, result.id); assertEquals("鈴木", result.name); } }
mock(...) でモックを作成して、when(...).thenReturn(...) でモックの処理を設定しています。
repository.find(1L) が実行されると、指定した User が返却されます。
4. アノテーションでモックを作成
Mockito のアノテーションを使って、モックを作成する方法は以下の通りです。
src/test/java/org/example/service/UserServiceTest.java
package org.example.service; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; import org.example.model.User; import org.example.repository.UserRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; class UserServiceTest { // モック @Mock UserRepository repository; // モックを設定するテスト対象クラス @InjectMocks UserService service; // モックの設定と解放 private AutoCloseable closeable; @BeforeEach public void openMocks() { closeable = MockitoAnnotations.openMocks(this); } @AfterEach public void releaseMocks() throws Exception { closeable.close(); } @Test void testFind() { // 準備 when(repository.find(1L)).thenReturn(new User(1L, "鈴木")); // 実行 User result = service.find(1L); // 検証 assertEquals(1L, result.id); assertEquals("鈴木", result.name); } }
@Mock で作成したモックを、@InjectMocks のクラスに設定してくれます。
5. テストの実行
IDE でテストクラスを実行するか、プロジェクトのルートディレクトリで以下のコマンドを実行します。
mvn test
6. 動作確認用の資源
6.1. モデル
動作確認で使用したモデルは以下の通りです。
src/main/java/org/example/model/User.java
package org.example.model; public class User { public Long id; public String name; public User(Long id, String name) { this.id = id; this.name = name; } }
6.2. リポジトリ
リポジトリは以下の通りです。
src/main/java/org/example/repository/UserRepository.java
package org.example.repository; import org.example.model.User; public class UserRepository { public User find(Long id) { // 省略 } }
6.3. ビルドファイル
Maven のビルドファイルは以下の通りです。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>test-mockito</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.9.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.1.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M8</version>
</plugin>
</plugins>
</build>
</project>