LoginSignup
0
0

【DbUnit】InsertやDeleteの検証ってどうやる?

Last updated at Posted at 2023-11-19

はじめに

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で数えなくても簡単に検証することができます。
JdbcTestUitlscountRowsInTables以外のメソッドも用意されているのでドキュメントを確認してみてください。

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));
    }
}

おわりに

間違いや改善点があればコメントまたは編集リクエストをお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0