はじめに
今回はjUnitで使用するMockについて、理解を深めていければと思いMockってなに?や使うとどんなメリットがあるの?などを深ぼっていければ思います!
間違い等ございましたらご指摘いただけますと幸いです。
Mock(モック)とは
モックは、ソフトウェアテストのために実際のオブジェクトの代わりに使用されるダミーオブジェクトです。
つまり、偽物のオブジェクト(Mock)を使用して、テストをする際に本物のオブジェクトに頼らずにテストができます。
Mockitoとは
JavaでMockオブジェクトを作成し、管理するためのフレームワーク(ライブラリ)です。
Mockitoのおかげで、Mockオブジェクトを簡単に作成し使用することができます。
Mockを使用するケース
1.Serviceクラス
@SpringBootTest
public class UserServiceTest {
@InjectMocks
private UserService service;
@Mock
private UserRepository repository;
@Test
void testDeleteById() {
Integer id = 1;
doNothing().when(repository).deleteById(id);
service.deleteById(id);
verify(repository, times(1)).deleteById(id);
}
}
@InjectMockは、Mockと同様Mockitoフレームワークで使われるアノテーションですが、用途と役割が異なります。テスト対象のクラスのインスタンスを作成し、そのクラスの依存関係を自動的にモックオブジェクトに注入するために使用されます。
2.Controllerクラス
@SpringBootTest
public class UserControllerTest {
@InjectMocks
private UserController controller;
@Mock
private UserService service;
@Test
void testDeleteUser() {
Integer id = 1;
doNothing().when(service).deleteById(id);
controller.deleteUser(id);
verify(service).deleteById(id);
}
}
(3.Repositoryクラス】
リポジトリクラスのテストでは、モックを使用することは比較的少ないです。
Mockを使用するメリット
・簡単にテストできる
モックを使うことで、テスト対象のコードが他のシステムやサービスに依存せずにテストできます。
例えば、データベースが設定されていなくても、モックを使うことで、データベースがあるかのように振る舞うことができます。これにより、テストを早く始めることができ、他のシステムの準備が整っていなくてもテストを進めることができます。
・スピードが速い
モックは実際のシステムを使わずに振る舞いを模擬するため、テストが非常に速く実行できます。
・安定したテスト
モックを使うと、テスト対象のコードが実際の外部システム(例えば、データベースやAPI)に依存せずにテストできます。これは、テストが外部システムの状態や動作に左右されません。
まとめ
上記の内容からもわかるように、モックを適切に活用することで、安定したテストが実現できます。
jUnitを実装する際には、モックを上手に活用して、テストの信頼性と効率を高めていければと思います!