学び:Javaテスト技術まとめ(Mockito / DBUnit / RestAssured など)

  •  
 
suu に投稿

JUnitとGradleでのテスト実行 最初に学んだのは、JUnitのテストをGradleでビルド・実行する方法です。GradleはJavaのプロジェクトを管理・自動化するビルドツールで、テストも簡単に実行できます。

例えば、次のコマンドを使うだけでJUnitのテストがすべて実行されます。

./gradlew test

このコマンドを実行すると、src/test/java フォルダにあるJUnitテストクラスが対象になり、テスト結果がコンソールに出力されます。テストに失敗すればエラー内容が表示され、成功すれば「BUILD SUCCESSFUL」と表示されます。

Mockitoによるモックの作成とテスト 次に学んだのは、Mockitoというライブラリを使って「モック」を作る方法です。

モックとは何か モックとは、実際のオブジェクトの代わりに使う、テスト専用の「ニセモノのオブジェクト」です。たとえば、データベースや外部のAPIのように、テスト中に呼び出したくない(重い・不安定・時間がかかる)機能の代わりにモックを使うことで、テストが簡単で確実になります。

Mockitoの基本的な使い方 Mockitoを使えば、数行のコードでモックを作成し、あらかじめ決めた値を返すように設定できます。

import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;

public class UserServiceTest {

    @Test
    void testGetUserName() {
        UserRepository mockRepo = mock(UserRepository.class);
        when(mockRepo.findNameById(1)).thenReturn("Taro");

        UserService service = new UserService(mockRepo);
        String result = service.getUserName(1);

        assertEquals("Taro", result);
    }
}

この例では、UserRepository というデータベースに接続するクラスをモックにして、テスト時には実際のデータベースを使わずに処理が行えるようにしています。

モックの振る舞いを検証する さらに、モックが「ちゃんと呼ばれたか」を確認することもできます。

verify(mockRepo).findNameById(1);

この1行で、指定したメソッドが呼び出されたかどうかをチェックできます。

DBUnitを使ったデータベースのテスト 次に学んだのは、DBUnitというライブラリを使って、データベースに対してテストを行う方法です。

DBUnitとは DBUnitは、テスト前にデータベースにテスト用のデータを投入し、テスト後にはデータをクリアすることで、毎回同じ条件で安定したテストを実行できるようにするツールです。

XMLやCSVでデータを用意しておき、Javaコードからそのデータをデータベースに読み込ませて使います。

CRUD操作のテスト たとえば、次のようなコードでXMLファイルからデータを読み込み、テストに使うことができます。

IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File("dataset.xml"));
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

これにより、テスト前にデータベースをある特定の状態にセットできるので、CRUD操作(Create, Read, Update, Delete)の正確性を検証できます。

DBUnitの活用場面 DAOやリポジトリクラスのテストで使える

毎回同じ状態からテストできるため、結果にばらつきが出ない

外部データを使ったブラックボックス的な検証が可能

Spring Bootアプリケーションの単体テスト Spring Bootを使ったアプリケーションでも、単体テストをしっかり書くことができます。

サービスの単体テスト サービスクラスのテストでは、内部のリポジトリをモックにして、処理のロジックだけに焦点を当てます。

@SpringBootTest
class MyServiceTest {

    @MockBean
    private MyRepository repo;

    @Autowired
    private MyService service;

    @Test
    void testGetValue() {
        when(repo.findValue()).thenReturn("Hello");
        assertEquals("Hello", service.getValue());
    }
}

このように、@MockBean でモックを注入し、@Autowired でテスト対象のサービスを取り出してテストを行うことができます。

MockMvcを使ったコントローラーのテスト コントローラー(Web画面やAPIの入り口)のテストには MockMvc を使います。これはブラウザを使わずに、HTTPリクエストを模擬してテストできる便利なツールです。

@WebMvcTest(MyController.class)
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testHello() throws Exception {
        mockMvc.perform(get("/hello"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello World"));
    }
}

この方法により、Webアプリケーションのコントローラー部分だけをピンポイントでテストすることができます。

RestAssuredによるAPIのテスト 最後に学んだのが、RestAssuredというライブラリを使ったREST APIのテスト方法です。MockMvcよりも実際にサーバーを起動してテストすることが多いため、より本番に近い形でAPIの動作を確認できます。

基本的な書き方

import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;

@Test
void apiTest() {
    given()
        .port(8080)
    .when()
        .get("/api/hello")
    .then()
        .statusCode(200)
        .body(equalTo("Hello"));
}

まとめ 今日の学びは、Javaのテスト技術を大きく広げるものでした。以下のような知識が身につきました。

JUnitとGradleによるテストの基本

Mockitoによるモックの作り方と活用方法

DBUnitによるデータベースの状態管理とテスト

Spring Bootアプリのサービスやコントローラーの単体テスト

RestAssuredを使った実践的なAPIテスト

どれも最初は難しそうに見えましたが、実際に使ってみると「テストがあると安心して開発できる」という実感が湧いてきました。今後も、各ツールをさらに深く理解しながら、自分の携わるプロジェクトでも使いこなしていきたいと思います。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。