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 として登録されるはず。
もっとスマートな方法があればいいが、そう面倒ではないので当座はこれで良い気がしている。