Spring Bootでのテストコードの書き方




テストコードを書く前の準備

環境

  • Kotlin:1.1.4-3
  • Spring Boot:1.5.6.RELEASE
  • JDK:1.8
  • ORM:Spring Data JPA

下記はbuild.gradleでの設定です。

buildscript {
	ext {
		kotlinVersion = '1.1.4-3'
		springBootVersion = '1.5.6.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
		classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
		classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
	}
}

 

使用するプラグインと準備

自分の場合はbuild.gradleのcompileを下記で設定しています。

  • spring-boot-starter-test:Spring Bootでテストコードを書く場合は導入してください。
  • DBUnit:これを使う場合はspring-test-dbunitとdbunitを使うようにしてください。
  • DbSetup-kotlin:テストデータの投入に使用します。これはKotlinバージョンなのでJavaで書く場合は別のものを導入してください。
dependencies {
	compile('org.springframework.boot:spring-boot-starter-data-jpa')
	compile('org.flywaydb:flyway-core')
	compile('org.springframework.boot:spring-boot-starter-web')
	compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
	compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
	runtime('mysql:mysql-connector-java')
	testCompile('org.springframework.boot:spring-boot-starter-test')
	testCompile('com.github.springtestdbunit:spring-test-dbunit:1.3.0')
	testCompile('org.dbunit:dbunit:2.5.3')
	testCompile('com.ninja-squad:DbSetup-kotlin:2.1.0')
}

テストコードの実装

まずpackageとimportを省略したテストコードが下記になります。それぞれについて一個ずづ説明していきます。

@DbUnitConfiguration(dataSetLoader = CsvDataSetLoader::class, databaseConnection=arrayOf("mysqlDataSource"))
@DatabaseSetup(value = "/fixture/mysql/alert_timeline/i_alert_timeline.csv", type = DatabaseOperation.CLEAN_INSERT)
@TestExecutionListeners(
    DependencyInjectionTestExecutionListener::class,
    DirtiesContextTestExecutionListener::class,
    TransactionDbUnitTestExecutionListener::class
)
@RunWith(SpringRunner::class)
@SpringBootTest
open class IAlertTimelineRepositoryTest {

    @Autowired
    lateinit var iAlertTimelineRepository: IAlertTimelineRepository

    @Test
    fun findOneById_IDで取得() {
        val iAlertTimeline: IAlertTimeline = iAlertTimelineRepository.findOneById("1")
        Assert.assertThat(iAlertTimeline.id, Matchers.`is`("1"))
    }
}

@DbUnitConfiguration

これはDBUnitの設定アノテーションで、テストデータの形式と使用するデータストアについて設定できます。CsvDataSetLoaderは独自に実装したクラスで下記のようになります。

class CsvDataSetLoader : AbstractDataSetLoader() {
    override fun createDataSet(resource: Resource): IDataSet {
       return CsvURLDataSet(resource.url)
    }
}

databaseConnectionにはBean名を設定しています。実際のBeanは下記です。このようにDataSourceを渡すことでテストで使用するデータベースを設定することができます。

/**
 * MySQL Database Config
 */
@Component
@ConfigurationProperties(prefix = "spring.datasource.mysql")
@EnableJpaRepositories(
        basePackages=arrayOf("com.sample.repository.mysql"),
        entityManagerFactoryRef="mysqlEntityManagerFactory"
)
class MySqlDatabaseConfig {

    var driverClassName: String = ""

    var url: String = ""

    var username: String = ""

    var password: String = ""

    @Primary
    @Bean("mysqlDataSource")
    fun dataSource(): DataSource {
        val dataSource: DriverManagerDataSource = DriverManagerDataSource()
        dataSource.setDriverClassName(driverClassName)
        dataSource.setUrl(url)
        dataSource.setUsername(username)
        dataSource.setPassword(password)
        return dataSource
    }
}

 

@DatabaseSetup

これはこのクラスでのテスト用データを指定するアノテーションです。パスはtest/resourcesからのパスになります。DatabaseOperation.CLEAN_INSERTはテスト実行前にテーブルを空にしてから毎回テストデータを投入してくれる設定になります。毎回同じ状態でテストするならこの設定にしとくといいと思います。

@TestExecutionListeners、@RunWith、@SpringBootTest

この3つは基本的にはその通り書いて置けば大丈夫です。

  • TestExecutionListeners:テスト時にDIやトランザクションの機能を使えるようにしたものです。
  • RunWith:テストを実行するRunnerを設定できます。
  • SpringBootTest:application.propertiesを読み込むなどのSpring Bootの機能を使えるようにするものです。

上記の詳しい説明は下記リンクを参照してください。

Spring Bootのテストコードで使うアノテーション解説

Matchers

テストしたいメソッドの返り値にはMatchersを使用します。Matchersにはたくさんの比較メソッドがありますが基本的にis()、 not()、sameInstance()などを覚えて置けばいいかと思います。

最後に

この記事で紹介したアノテーションや実装方法を理解すれば他のデータベースや複雑なテストもできるようになるかと思います。

下記リンクにSpring Boot関連の記事をまとめたのでこちらも是非参考にしていただければと思います。

おすすめ書籍

JPAに関して体系的に学べる良い書籍だと思います。良くあるSpring系書籍ですとJPAは少ししか紹介がありませんが丸々一冊JPAに関してなので詳細な解説がされています。内容はJPAと他のORMとの比較から始まりセットアップ、実装の仕方まで幅広く網羅されています。これからJPAで開発を初めてみようかなと考えている方は一読することをオススメします!

Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です