Mockito でモックオブジェクトを作成して、単体テストをする方法を書いていきます。
動作確認で使用した製品のバージョンは以下の通りです。
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'
今回は、以下のサービスクラスをテストします。
src/main/java/org/example/service/UserService.java
package org.example.service;import org.example.model.User;import org.example.repository.UserRepository;publicclass UserService {public UserRepository repository;public User find(Long id) {return repository.find(id); }}
テストでは、リポジトリのモックを作成します。
サービスクラスのテストで、手動でリポジトリのモックを作成する方法は以下の通りです。
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 {privatefinal UserService service =new UserService();@Testvoid 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 が返却されます。
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;@BeforeEachpublicvoid openMocks() { closeable = MockitoAnnotations.openMocks(this); }@AfterEachpublicvoid releaseMocks()throws Exception { closeable.close(); }@Testvoid testFind() {// 準備 when(repository.find(1L)).thenReturn(new User(1L,"鈴木"));// 実行 User result = service.find(1L);// 検証 assertEquals(1L, result.id); assertEquals("鈴木", result.name); }}
@Mock で作成したモックを、@InjectMocks のクラスに設定してくれます。
IDE でテストクラスを実行するか、プロジェクトのルートディレクトリで以下のコマンドを実行します。
mvn test
動作確認で使用したモデルは以下の通りです。
src/main/java/org/example/model/User.java
package org.example.model;publicclass User {public Long id;public String name;public User(Long id, String name) {this.id = id;this.name = name; }}
リポジトリは以下の通りです。
src/main/java/org/example/repository/UserRepository.java
package org.example.repository;import org.example.model.User;publicclass UserRepository {public User find(Long id) {// 省略 }}
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>
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。