ryhmrt’s blog

意識低い系プログラマの雑記

Spring Boot + DBUnit でテスト用のDBを定義する

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 として登録されるはず。

もっとスマートな方法があればいいが、そう面倒ではないので当座はこれで良い気がしている。