はじめに
DBテストのInsertやDeleteの検証はどのようにしていますか?JdbcTestUtilsを使うと便利なので紹介したいと思います。
前提条件
- DbUnitなどを使ってDBテストの環境を構築済み
開発環境
SpringBoot 3.1.0
DbUnit 2.7.3
使い方
テストデータ
以下のようなテーブルとテストデータがあります。
mysql> desc Task;
+------------+--------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+-------------------+
| task_id | int | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| content | varchar(255) | NO | | NULL | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | datetime | YES | | NULL | |
+------------+--------------+------+-----+-------------------+-------------------+
mysql> SELECT * FROM Task;
+---------+--------------------+------------+---------------------+------------+
| task_id | title | content | created_at | updated_at |
+---------+--------------------+------------+---------------------+------------+
| 1 | 出張申請 | 北海道への出張 | 2023-11-05 21:22:37 | NULL |
+---------+--------------------+------------+---------------------+------------+
プロダクションコード
以下のようなプロダクションコードがあります。
TaskRepository.java
@Repository
public class TaskRepository {
private final JdbcTemplate jdbcTemplate;
@Autowired
public TaskRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void insertTask(Task task) {
String query = """
INSERT INTO Task
(
title,
content
)
VALUES(
?,
?
)
""";
jdbcTemplate.update(query, task.getTitle(), task.getContent());
}
}
テストコード
JdbcTestUtils
クラスのcountRowsInTables
メソッドを使ってテーブルの行数を取得しています。
このようにすればSELECT
で数えなくても簡単に検証することができます。
JdbcTestUitls
はcountRowsInTables
以外のメソッドも用意されているのでドキュメントを確認してみてください。
TaskRepositoryTest.java
@SpringBootTest
class TaskRepositoryTest {
private final JdbcTemplate jdbcTemplate;
private final TaskRepository repository;
@Autowired
public TaskRepositoryTest(JdbcTemplate jdbcTemplate, TaskRepository repository) {
this.jdbcTemplate = jdbcTemplate;
this.repository = repository;
}
@Test
@DisplayName("insertTasktメソッドで1件新規登録できることを確認する")
public void insertTaskTest() {
// 投入データの作成
var task = new Task();
task.setTitle("17時からMTG");
task.setContent("");
// タスクを登録
this.repository.insertTask(task);
// テーブルの行数を取得
int actual = JdbcTestUtils.countRowsInTable(this.jdbcTemplate, "Task");
// 検証
assertThat(actual, is(2));
}
}
おわりに
間違いや改善点があればコメントまたは編集リクエストをお願いします。