📘 Vol.10.5：DAO・DTOのテスト設計（JUnitやH2活用）

本記事では、DAO（Data Access Object）およびDTO（Data Transfer Object）のテスト設計について、**JUnit** と **H2データベース** を活用した方法を解説します。

---

## 🧪 1. テストの目的と範囲

- **DAOのテスト**：データベースとのやり取りが正しく行われているかを確認
- **DTOのテスト**：データの受け渡しが正しく行われているかを確認

---

## 🛠 2. H2データベースの設定

H2は、**インメモリで動作する軽量なRDB** で、テスト用途に非常に適しています。

### 📦 Maven依存関係の追加

```xml
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>
```

### ⚙ テスト用のデータソース設定例

```properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create
```
※Spring Boot 環境を想定していますが、純粋なJDBCでも `DriverManager.getConnection("jdbc:h2:mem:testdb")` のように使えます。

---

### ✅ 3. JUnitによるDAOのテスト

以下は、`UserDao` に対する基本的なテスト例です。

```java
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {

    @Autowired
    private UserDao userDao;

    @Test
    public void testFindById() {
        User user = userDao.findById(1);
        assertNotNull(user);
        assertEquals("John", user.getUsername());
    }
}

```

---

### 📦 4. DTOのテスト

DTOはシンプルなデータ構造なので、**ゲッター・セッターの動作確認**が中心です。

```java
@Test
public void testUserDto() {
    User user = new User();
    user.setUserId(1);
    user.setUsername("John");
    user.setEmail("john@example.com");

    assertEquals(1, user.getUserId());
    assertEquals("John", user.getUsername());
    assertEquals("john@example.com", user.getEmail());
}

```

---

### 🗃 5. テストデータの投入（data.sql）

`src/test/resources/data.sql` に以下のようなSQLを記述しておくと、テスト時に自動実行されます。

```sql
INSERT INTO users (user_id, username, email) VALUES (1, 'John', 'john@example.com');

```

これは、Spring Bootなどの環境で `spring.jpa.hibernate.ddl-auto=create` と組み合わせて利用します。

---

### 🧾 まとめ

| 項目       | 内容                               |
| -------- | -------------------------------- |
| H2       | 軽量なインメモリDB。JDBC互換で本番環境と似た動作確認が可能 |
| JUnit    | DAO・DTOの挙動を自動化テスト                |
| data.sql | テスト用データを一括投入できる便利な仕組み            |


**📌 次回予告：**

📘 Vol.10.6：**Service層の設計方針と例外処理戦略**
→ DAO・DTOの上位層にあたる Service の設計と、例外処理（例：DB例外やバリデーション例外）の戦略について詳しく解説予定です！

---

### 🧵 過去シリーズ一覧

- Vol.10.1：DTO設計のベストプラクティス

- Vol.10.2：DAOのインタフェース設計と実装パターン

- Vol.10.3：DB接続クラスの共通化とドライバ設計

- Vol.10.4：Actionとの連携実装（Struts2との融合）

👍 お役に立てましたらLGTM＆フォローお願いします！

---


### ✨ シリーズまとめ（Vol.10.x バリデーション編）

- [✅ Vol.10.0：DAO / DTO / JavaBeansとは？ ― データ層設計の全体像と役割分担 ―](https://qiita.com/drafts/19c1d526df28240e0cb1/edit)

- [✅ Vol.10.1：DTO設計のベストプラクティス（命名規則・フィールド設計](https://qiita.com/juehara-crypto/items/1b0ad616095f8ae134ec)

- [✅ Vol.10.2：DAOのインタフェース設計と実装パターン ](https://qiita.com/juehara-crypto/items/bcb15618440bef5931ef)

- [✅ Vol.10.3：DB接続クラスの共通化とドライバ設計](https://qiita.com/juehara-crypto/items/c3d4e8e6887d5ec8e1eb)

- [✅ Vol.10.4：Actionとの連携実装（Struts2との融合）](https://qiita.com/juehara-crypto/items/b8873de1aa9e46cd9309)

- [✅ Vol.10.6：Service層の設計方針と例外処理戦略 ](https://qiita.com/juehara-crypto/items/6685c303c40e48b3c1f3)

- [✅ Vol.10.7：Service層×JUnitテストの基本とパターン](https://qiita.com/juehara-crypto/items/128fda40df3ffa0fedce)

- [✅ Vol.10.8：Service層の共通基盤化とDI対応 ](https://qiita.com/juehara-crypto/items/8e94acf2a31be15aaf94)

---