JUnitでDbSetupの使い方

JUnitでDbSetupの使い方

JUnitでDbSetupを使う方法です。Gradleプロジェクトで試しました。

build.gradleのdependenciesに以下1文を追加します。

testImplementation 'com.ninja-squad:DbSetup:2.1.0'

view raw
gistfile1.txt
hosted with ❤ by GitHub

DbSetupのダウンロード方法はこちらを参照ください。※リンク先ではtestcompileと書いてますが、testImplementationに変更してください。

Gradle4.7

JPAのfindByIdのテストです。assertJで検証しています。

package jp.co.confrage.repository;
import static org.assertj.core.api.Assertions.assertThat;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.ninja_squad.dbsetup.DbSetup;
import com.ninja_squad.dbsetup.Operations;
import com.ninja_squad.dbsetup.destination.DataSourceDestination;
import com.ninja_squad.dbsetup.destination.Destination;
import com.ninja_squad.dbsetup.operation.Operation;
import jp.co.confrage.entity.UserEntity;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRipositoryTest {
@Autowired
private DataSource dataSource;
@Autowired
private UserRepository repository;
private static final Operation DELETE_ALL_USER = Operations.deleteAllFrom("USER"); // 初期化(delete)するテーブル
private static final Operation INSERT_USER = Operations.insertInto("USER") // 初期投入データ2件
.columns("id","address","age","birth_day","password","empname","status","tel")
.values(1, "osaka", 10,"2010-01-01","1234","takahashi",1,"00-000-00")
.values(2, "tokyo", 20,"2000-02-02","5678","higashiguchi",100,"99-999-99")
.build();
@Test
public void test() {
Destination destination = new DataSourceDestination(dataSource); // 勝手にapplication.propertiesのdatasourceの情報を取得
new DbSetup(destination, Operations.sequenceOf(DELETE_ALL_USER, INSERT_USER)).launch(); // 初期化とデータ投入が実行される
UserEntity entity = repository.findById(1L).orElse(null); //id=1のデータを取得
assertThat(entity.getAddress()).isEqualTo("osaka"); // アドレスが等しいか検証
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

@RunWith(SpringRunner.class)と@SpringBootTestアノテーションを書いておけばjavax.sql.DataSourceクラスのインスタンスに勝手にapplication.properties(yml)を読み込んでくれます。

columnsメソッドでテーブルカラムを定義して、メソッドチェーンでvaluesメソッドを使用する方法がお勧めです。

row()メソッドを使用して複数データを投入するとcolumnメソッドが続いてしまうので長くなってしまいます。

private static final Operation INSERT_USER = Operations.insertInto("USER") // 初期投入データ
.row()
.column("id", 1)
.column("address", "osaka")
.column("age", 10)
.column("birth_day", "2010-01-01")
.column("password", "1234")
.column("empname", "takahashi")
.column("status", 1)
.column("tel", "00-000-00")
.end()
.build(); // これでレコード1件投入

view raw
gistfile1.txt
hosted with ❤ by GitHub

2件投入しようとすると以下のようにend()メソッドの後にrow()メソッドを繋げていく感じなので見にくくなってしまいます。

private static final Operation INSERT_USER = Operations.insertInto("USER") // 初期投入データ
.row()
.column("id", 1)
.column("address", "osaka")
.column("age", 10)
.column("birth_day", "2010-01-01")
.column("password", "1234")
.column("empname", "takahashi")
.column("status", 1)
.column("tel", "00-000-00")
.end()
.row()
.column("id", 2)
.column("address", "tokyo")
.column("age", 20)
.column("birth_day", "2000-02-02")
.column("password", "5678")
.column("empname", "higashiguchi")
.column("status", 100)
.column("tel", "99-999-99")
.end()
.build();

view raw
gistfile1.txt
hosted with ❤ by GitHub

withDefaultValueメソッド

withDefaultValueメソッドを使えば、検証に不要なカラムのデフォルト値を全てのレコードに対して設定することができます。

private static final Operation INSERT_USER = Operations.insertInto("USER") // 初期投入データ
.withDefaultValue("address", "aichi") // addressに対しては全てのレコードに"aichi"が入る
.columns("id","age","birth_day","password","empname","status","tel")
.values(1, 10,"2010-01-01","1234","takahashi",1,"00-000-00")
.values(2, 20,"2000-02-02","5678","higashiguchi",100,"99-999-99")
.build();

view raw
gistfile1.txt
hosted with ❤ by GitHub

テストコードを実行すると、addressにaichiと入ります。これで不要な列に対しては適当な値を入れることが可能です。

JUnitでDbSetupの使い方

h2などのインメモリデータベースと@DataJpaTestアノテーションを使ったほうがレコードのコンフリクトが発生しないのでそっちのほうが良いかもしれないです。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA