Spring Boot のプロジェクトで DBUnit を使うときに、テスト用の DB を定義する自分なりの方法をメモ。
通常以下のようなブートストラップ用の Application クラスがあるはず。
package myapp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
で、以下の様に @SpringApplicationConfiguration にこのクラスを設定して Spring の設定をすると思う。
package myapp; ...(省略)... @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class }) public class SomeTest { @Test @DatabaseSetup("sample-data.xml") public void test() { ...(省略)...
これとは別にテスト用の DB 設定のクラスを追加する。定義はこんな感じ。
package myapp; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.jdbc.datasource.DriverManagerDataSource; @PropertySource("classpath:/test.properties") public class TestConfiguration { @Autowired private Environment environment; @Bean public DataSource dataSource() { return new DriverManagerDataSource( environment.getProperty("test.datasource.url"), environment.getProperty("test.datasource.username"), environment.getProperty("test.datasource.password")); } }
接続定義のプロパティファイルも忘れずに。
test.datasource.url=jdbc:postgresql://localhost:15432/myapp_test test.datasource.username=myapp test.datasource.password=myapp test.datasource.driver-class-name=org.postgresql.Driver
テストクラスは @SpringApplicationConfiguration アノテーションだけ変更。
@SpringApplicationConfiguration(classes = {Application.class, TestConfiguration.class})
これで、テスト実行時は TestConfiguration で test.properties の設定に基づいて生成された DB 接続が DataSource として登録されるはず。
もっとスマートな方法があればいいが、そう面倒ではないので当座はこれで良い気がしている。