testcontainers を使ってテスト実行
テスト実行時のみデータベースコンテナを作成し、毎回綺麗な DB 環境を提供します。
実装
例として、MariaDBをテスト用 DB として使用します。
依存関係
pom.xmlに下記を追記します。
<!-- testcontainers -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mariadb</artifactId>
<version>1.18.3</version>
<scope>test</scope>
</dependency>
SQL
test/resources配下に、初期実行用の SQL ファイルを作成します。今回はファイル名をcreate_table.sqlと想定します。
-- 古いテーブルが存在すれば削除
DROP TABLE IF EXISTS account;
-- テーブル作成
CREATE TABLE IF NOT EXISTS account (
id INT AUTO_INCREMENT PRIMARY KEY
, name VARCHAR(20) NOT NULL
, inp_date TIMESTAMP
);
-- テストデータ挿入
INSERT INTO account (
name
) VALUES (
'first-nob'
), (
'second-nob'
), (
'third-nob'
);
テスト作成
下記でテストクラスを作成します。
package com.example.utsample.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.testcontainers.containers.MariaDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import com.example.utsample.entity.Account;
/**
* SampleDaoImplのテストクラスです。
*
*/
@SpringBootTest
@Testcontainers(disabledWithoutDocker = true) // docker環境が無い場合はテストがスキップされます。
@Sql("classpath:create_table.sql") // 各メソッド実行前にSQLファイルを読み込みます。
public class SampleDaoTest {
// データベースのコンテナイメージなど、DB構築に必要な設定値です。
static final DockerImageName MARIA_DB_IMAGE_NAME = DockerImageName.parse("mariadb").withTag("10.5");
static final String DATABASE_NAME = "nob";
static final String USER_NAME = "root";
static final String PASSWORD = "";
// テスト用DBコンテナを作成します。
@Container
static final MariaDBContainer<?> mariaDbContainer = new MariaDBContainer<>(MARIA_DB_IMAGE_NAME)
.withDatabaseName(DATABASE_NAME)
.withUsername(USER_NAME)
.withPassword(PASSWORD);
// 接続情報などの設定値を投入します。
@DynamicPropertySource
static void registerProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", mariaDbContainer::getJdbcUrl);
registry.add("spring.datasource.username", mariaDbContainer::getUsername);
registry.add("spring.datasource.password", mariaDbContainer::getPassword);
}
// テストクラスです。
@Autowired
private SampleDao sampleDao;
/**
* selectAllのテスト 正常系
*
*/
@Test
public void testSelectAll() {
List<Account> accountList = new ArrayList<>();
try {
accountList = sampleDao.selectAll();
} catch (Exception e) {
fail();
e.printStackTrace();
}
assertEquals(3, accountList.size());
}
}