# 10.1. 単体テスト概要

## 10.1.1. はじめに

本章では、Macchinetta Server Framework (1.x)を使用したシステムにおける、JUnitを用いた単体テストについて提示する。

ここでの単体テストのスコープはレイヤまたはレイヤ間結合とし、テストに関するアクティビティのうち、テスト実装とテスト実施に関して解説する。なお、解説するテスト実装は参考例でありシステムの品質を保証するためのテスト方針については、別途検討いただきたい。

## 10.1.2. 単体テストガイドラインが示すこと

本章では、以下のOSSライブラリを使用したレイヤまたはレイヤ間のテスト実装方法について説明する。

### 10.1.2.1. 単体テストで利用するOSSライブラリ構成

#### 10.1.2.1.1. テスティングフレームワーク

Javaのテスティングフレームワークとして、JUnitを使用する。

#### 10.1.2.1.2. アサーション

アサーションに使用するライブラリとしてHamcrestを使用する。
JUnit4が標準でサポートしているアサーションライブラリである。

#### 10.1.2.1.3. モック化

テスト対象のメソッドが依存するクラスをモック化するためのライブラリとしてMockitoを使用する。

#### 10.1.2.1.4. DIコンテナ

テスト用のDIコンテナとしてSpring TestのDI機能を使用する。

#### 10.1.2.1.5. MVCフレームワーク

テスト用のMVCフレームワークとしてSpring MVC Test Frameworkを使用する。

#### 10.1.2.1.6. トランザクション管理

テスト用のトランザクション管理としてSpring Testのトランザクション管理機能を使用する。

#### 10.1.2.1.7. データアクセス

テスト用のデータアクセスとして、Spring TestまたはDBUnitとSpring Test DBUnitを使用することを想定している。

- Spring Test

  - Spring Testは`@Sql`アノテーションや`JdbcTemplate`などを使用してSQLを発行する機能を提供している。

- DBUnitとSpring Test DBUnit

  - Spring Test DBUnitは、Spring Framework上でDBUnitを利用する際の支援ライブラリのため、DBUnitと組み合わせて使用する。
    DBUnitの提供するデータベースのセットアップ、状態の検証などの機能をアノテーションベースで実装する機能を提供している。

### 10.1.2.2. 単体テストで利用するOSSライブラリのバージョン

単体テストで利用するOSSライブラリの一覧を以下に示す。

なお、以下のOSSライブラリはあくまで一例であり、実際は業務要件に合わせたライブラリを検討いただきたい。
本章内のアプリケーション自体を動作させるために利用するOSSライブラリ一覧については、利用するOSSのバージョンを参照されたい。

以下のOSSライブラリの中で、特にSpring Test（MockMvc）、Mockitoの使い方については、単体テストで利用するOSSライブラリの使い方で詳細を説明する。

Type | GroupId | ArtifactId | Version | Spring Boot
--- | --- | --- | --- | ---
JUnit | junit | junit | 4.13.2 | *
Hamcrest | org.hamcrest | hamcrest | 3.0 | *
Mockito | org.mockito | mockito-core | 5.17.0 | *
Spring Test | org.springframework | spring-test | 6.2.15 | *
DBUnit | org.dbunit | dbunit | 2.8.0 |
Spring Test DBUnit | com.github.springtestdbunit | spring-test-dbunit | 1.3.0 |

Note

Hamcrest 2.1より、`hamcrest-core`と`hamcrest-library`にあたるモジュールが`hamcrest`に統合されたため、実施したいアサーションにより`hamcrest-library`のような依存関係を追加する必要がなくなった。

なお、Maven依存関係としては`hamcrest-core`と`hamcrest-library`を引き続き利用することができるが、実態としてはすべて`hamcrest`を参照する形となる。

### 10.1.2.3. 単体テストの実装

単体テストはアプリケーションのレイヤ化に沿った以下のレイヤ単位で実装している。レイヤまたはレイヤ間のテスト方法をレイヤごとのテスト実装で説明する。
レイヤ単位に当てはめられない共通機能や、機能特有のテスト方法は、機能ごとのテスト実装で説明する。

## 10.1.3. 対象読者

本章は、このドキュメントの対象読者に加えて以下の知識・経験があることを前提としている。

- JUnitを使用した単体テストを行ったことがある

## 10.1.4. 単体テストの動作検証環境

本章は、以下の環境で動作検証をしている。
他の環境で実施する際は、本章をベースに適宜読み替えること。

種別 | 名前
--- | ---
OS | Windows 11
JVM | Java 17
IDE | Spring Tool Suite 5.0.0.RELEASE (以降「STS」と呼ぶ。設定方法はSTSの設定手順を参照されたい。)
Build Tool | Apache Maven 3.9.9 (以降「Maven」と呼ぶ)
RDBMS | PostgreSQL 18.1