JUnitとMockitoは、Javaプログラムの単体テストを効率的に行うためのフレームワークです。Mockitoは、テスト対象のクラスが依存している外部コンポーネント(他のクラスやDBなど)を模擬的なオブジェクト(モック)に置き換えるために使用されます。
基本的な使い方を以下に解説します。
- 依存関係の追加
Mavenプロジェクトの場合、pom.xmlに以下の依存関係を追加します:
xml
- サンプルコード
ここでは、UserServiceがUserRepositoryに依存しているというシナリオを想定します。
java
// 依存先のインターフェース
public interface UserRepository {
String findUserNameById(int id);
}
// テスト対象のクラス
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserInfo(int id) {
String name = userRepository.findUserNameById(id);
if (name != null) {
return "User: " + name;
}
return "User not found";
}
}
コードは注意してご使用ください。
- テストコードの書き方
Mockitoを使ってUserRepositoryのモックを作成し、UserServiceのテストを行います。
java
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class UserServiceTest {
@Mock
private UserRepository userRepository; // モックオブジェクト
@InjectMocks
private UserService userService; // テスト対象クラスにモックを注入
@BeforeEach
public void setUp() {
// Mockitoのアノテーションを初期化
MockitoAnnotations.openMocks(this);
}
@Test
public void testGetUserInfo_UserFound() {
int userId = 1;
String expectedName = "John Doe";
// モックの振る舞いを設定
// "findUserNameById(1)"が呼ばれたら、"John Doe"を返すように設定
when(userRepository.findUserNameById(userId)).thenReturn(expectedName);
// テスト対象のメソッドを実行
String result = userService.getUserInfo(userId);
// 結果を検証
assertEquals("User: John Doe", result);
// userRepositoryのfindUserNameByIdメソッドが1回呼ばれたことを検証
verify(userRepository, times(1)).findUserNameById(userId);
}
@Test
public void testGetUserInfo_UserNotFound() {
int userId = 2;
// "findUserNameById(2)"が呼ばれたら、nullを返すように設定
when(userRepository.findUserNameById(userId)).thenReturn(null);
// テスト対象のメソッドを実行
String result = userService.getUserInfo(userId);
// 結果を検証
assertEquals("User not found", result);
// userRepositoryのfindUserNameByIdメソッドが1回呼ばれたことを検証
verify(userRepository, times(1)).findUserNameById(userId);
}
}
コードは注意してご使用ください。
主要なMockitoメソッド
mock() / @Mock: モックオブジェクトを作成します。
when(...).thenReturn(...): 特定のメソッドが呼ばれたときに返す値を設定します(スタブ化)。
verify(...): モックオブジェクトの特定のメソッドが、期待通りに呼び出されたかどうかを検証します。
doThrow(...).when(...): void型のメソッドが呼ばれたときに例外をスローするように設定します。