JUnitでDbSetupの使い方
JUnitでDbSetupを使う方法です。Gradleプロジェクトで試しました。
build.gradleのdependenciesに以下1文を追加します。
testImplementation 'com.ninja-squad:DbSetup:2.1.0'
DbSetupのダウンロード方法はこちらを参照ください。※リンク先ではtestcompileと書いてますが、testImplementationに変更してください。
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と入ります。これで不要な列に対しては適当な値を入れることが可能です。
h2などのインメモリデータベースと@DataJpaTestアノテーションを使ったほうがレコードのコンフリクトが発生しないのでそっちのほうが良いかもしれないです。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント