JUnitでDbSetupの使い方

JUnitでDbSetupの使い方

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

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

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

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"); // アドレスが等しいか検証
    }
}

@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件投入

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

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

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

JUnitでDbSetupの使い方

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

コメント

タイトルとURLをコピーしました