学生管理モジュールの単体テスト

JavaBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、JUnit 5 と Mockito を使って学生管理モジュールの単体テストを作成する方法を学びます。このプロジェクトには 2 つの主なタスクが含まれています。StudentServiceImplクラスのテスト作成とStudentControllerクラスのテスト作成です。

🎯 タスク

このプロジェクトで学ぶことは以下の通りです。

  • JUnit 5 を使ってStudentServiceImplクラスをテストするためのServiceTests.javaファイルを作成する方法
  • JUnit 5 と Mockito を使ってStudentControllerクラスをテストするためのControllerTests.javaファイルを作成する方法
  • @SpringBootTest@MockBeanなどの Spring Boot テスト機能を使って必要なコンポーネントを読み込み、テスト用のモックを作成する方法
  • StudentServiceImplクラスのqueryStudents()insertStudent()deleteStudent()メソッドの機能を検証するためのテストケースを書く方法
  • StudentControllerクラスのgetStudents()getStudent()modifyStudent()メソッドの機能を検証するためのテストケースを書く方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • JUnit 5 と Mockito を使って Spring Boot アプリケーションの単体テストをセットアップする
  • Spring Boot テスト機能を使って必要なコンポーネントを読み込み、テスト用のモックを作成する
  • サービス層とコントローラ層の実装の正確性を保証するための効果的なテストケースを書く
  • テスト対象のメソッドの期待される動作を検証するためにアサーションを使う

ServiceTests.java ファイルを作成する

このステップでは、JUnit 5 を使ってStudentServiceImplクラスをテストするためのServiceTests.javaファイルを作成する方法を学びます。

  1. IDE を開き、プロジェクト内の/test/java/org/labex/springboottestingディレクトリに移動します。
  2. 新しい Java ファイルをServiceTests.javaと名前付けて作成します。
  3. ServiceTests.javaファイルに、以下のコードを追加します。
package org.labex.springboottesting;

import org.junit.jupiter.api.Test;
import org.labex.springboottesting.service.StudentServiceImpl;
import org.labex.springboottesting.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

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

@SpringBootTest(classes = StudentServiceImpl.class)
class ServiceTests {

    @Autowired
    private StudentServiceImpl service;

    @Test
    void testQueryStudents() {
        // サービスの queryStudents() メソッドをテストして、正しいデータの取得を確認する。
        List<Student> result = service.queryStudents();

        // 返されたリストのサイズが期待されるサイズと一致することをアサートする。
        assertEquals(3, result.size());
    }

    @Test
    void testInsertStudent() {
        // 挿入するサンプルの学生オブジェクトを作成する。
        Student student = new Student("1", "test", 18, "male");

        // サービスの insertStudent() メソッドをテストして、正常な挿入を確認する。
        Boolean result = service.insertStudent(student);

        // 挿入操作が成功したことをアサートする。
        assertTrue(result);
    }

    @Test
    void testDeleteStudent() {
        // サービスの deleteStudent() メソッドをテストして、正常な削除を確認する。
        Boolean result = service.deleteStudent("20191001");

        // 削除操作が成功したことをアサートする。
        assertTrue(result);
    }
}

ServiceTestsクラスは、@SpringBootTest(classes = StudentServiceImpl.class)でアノテートされており、テストクラスにStudentServiceImpl実装クラスを読み込むために使用されます。このクラスには 3 つのテストメソッドが含まれています。

  1. testQueryStudents(): IStudentServiceインターフェイスのqueryStudents()メソッドをテストして、返される学生のリストが期待されるサイズであることを確認します。
  2. testInsertStudent(): IStudentServiceインターフェイスのinsertStudent()メソッドをテストして、学生の挿入操作が成功することを確認します。
  3. testDeleteStudent(): IStudentServiceインターフェイスのdeleteStudent()メソッドをテストして、学生の削除操作が成功することを確認します。

ControllerTests.java ファイルを作成する

このステップでは、Mockito テストフレームワークを使ってStudentControllerクラスをテストするためのControllerTests.javaファイルを作成する方法を学びます。

  1. IDE を開き、プロジェクト内の/test/java/org/labex/springboottestingディレクトリに移動します。
  2. 新しい Java ファイルをControllerTests.javaと名前付けて作成します。
  3. ControllerTests.javaファイルに、以下のコードを追加します。
package org.labex.springboottesting;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.labex.springboottesting.dao.IStudentDAO;
import org.labex.springboottesting.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import java.util.ArrayList;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest // Spring Boot アプリケーションコンテキストを読み込む。
@EnableWebMvc // Spring Web MVC 機能を有効にする。
@AutoConfigureMockMvc // MockMvc インスタンスを設定する。
class ControllerTests {

    @Autowired
    private MockMvc mockMvc; // HTTP リクエストをシミュレートするための MockMvc インスタンスを注入する。

    private ObjectMapper objectMapper; // JSON 変換用の ObjectMapper。

    @MockBean // IStudentDAO のモックを作成するための MockBean アノテーション。
    private IStudentDAO studentDAO;

    @BeforeEach
    void setUp() {
        // オブジェクトを JSON に変換したり、その逆を行うために ObjectMapper を初期化する。
        this.objectMapper = new ObjectMapper();
    }

    @Test
    void testGetStudents() throws Exception {
        // サンプルの学生を作成する。
        Student s1 = new Student("20191001", "John", 18, "Male");
        Student s2 = new Student("20191069", "Lily", 19, "Female");

        // 学生のリストを作成し、サンプルの学生を追加する。
        ArrayList<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);

        // findStudentAll() が呼び出されたときに学生のリストを返すように、studentDAO の動作をモックする。
        when(studentDAO.findStudentAll()).thenReturn(list);

        // すべての学生を取得するための GET リクエストを実行し、レスポンスを検証する。
        this.mockMvc.perform(get("/api/v2/students")
                       .accept("application/json; charset=UTF-8")) // 期待されるレスポンスタイプを指定するために Accept ヘッダを設定する。
               .andDo(print()) // リクエストとレスポンスの詳細を表示する。
               .andExpect(status().isOk()) // レスポンスステータスが OK (200) であることを検証する。
               .andReturn(); // さらなるアサーションのために MvcResult オブジェクトを返す。
    }

    @Test
    void testGetStudent() throws Exception {
        // サンプルの学生を作成する。
        Student s1 = new Student("20191001", "John", 18, "Male");

        // "20191001"が findStudentById() に渡されたときにサンプルの学生を返すように、studentDAO の動作をモックする。
        when(studentDAO.findStudentById("20191001")).thenReturn(s1);

        // 特定の学生を ID で取得するための GET リクエストを実行し、レスポンスを検証する。
        this.mockMvc.perform(get("/api/v2/student/20191001")
                       .accept("application/json; charset=UTF-8"))
               .andDo(print())
               .andExpect(status().isOk())
               .andReturn();
    }

    @Test
    void testModifyStudent() throws Exception {
        // サンプルの学生を作成する。
        Student s1 = new Student("20191001", "John", 18, "Male");

        // サンプルの学生を JSON 形式に変換する。
        String content = objectMapper.writeValueAsString(s1);

        // 任意の学生オブジェクトが updateStudent() に渡されたときに true を返すように、studentDAO の動作をモックする。
        when(studentDAO.updateStudent(any())).thenReturn(true);

        // 学生を変更するための PUT リクエストを実行し、レスポンスを検証する。
        this.mockMvc.perform(put("/api/v2/student")
                       .content(content)
                       .contentType(MediaType.APPLICATION_JSON)
                       .accept("application/json; charset=UTF-8"))
               .andDo(print())
               .andExpect(status().isOk())
               .andReturn();
    }
}

ControllerTestsクラスは、@SpringBootTestで Spring Boot アプリケーションコンテキストを読み込み、@EnableWebMvcで Spring Web MVC 機能を有効にし、@AutoConfigureMockMvcMockMvcインスタンスを設定するためのアノテーションが付けられています。このクラスには 3 つのテストメソッドが含まれています。

  1. testGetStudents(): IStudentDAOインターフェイスの動作をモックし、/api/v2/studentsエンドポイントに GET リクエストを行うことで、StudentControllerクラスのgetStudents()メソッドをテストします。
  2. testGetStudent(): IStudentDAOインターフェイスの動作をモックし、/api/v2/student/20191001エンドポイントに GET リクエストを行うことで、StudentControllerクラスのgetStudent()メソッドをテストします。
  3. testModifyStudent(): IStudentDAOインターフェイスの動作をモックし、サンプルの学生オブジェクトを JSON に変換し、/api/v2/studentエンドポイントに PUT リクエストを行うことで、StudentControllerクラスのmodifyStudent()メソッドをテストします。

テストを実行する

これで、ServiceTests.javaControllerTests.java ファイルを作成したので、StudentServiceImplStudentController クラスの機能を検証するためにテストを実行できます。

  1. ターミナルまたはコマンドプロンプトを開き、以下のコマンドを使用してプロジェクトディレクトリに移動します。
cd ~/project/springboottesting/
  1. 以下のコマンドを実行して、ServiceTests クラスを実行します。
mvn test -Dtest=ServiceTests

これにより、ServiceTests クラスの 3 つのテストメソッドが実行され、結果が表示されます。

  1. 以下のコマンドを実行して、ControllerTests クラスを実行します。
mvn test -Dtest=ControllerTests

これにより、ControllerTests クラスの 3 つのテストメソッドが実行され、結果が表示されます。

コンソール出力には、合格または不合格のテストを含むテスト結果が表示されるはずです。

まとめ

おめでとうございます!このプロジェクトを完了しました。実験技術を向上させるために、LabEx でさらに多くの実験を行ってみましょう。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習