テストコードを書く前の準備
環境
- 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関連の記事をまとめたのでこちらも是非参考にしていただければと思います。
- Spring Bootで環境毎にapplication.propertiesを読み込む方法
- Spring BootでFlywayを使用したMySQLのマイグレーション
- GradleでRedshift JDBC Driverの取得と設定方法
- KotlinでSpring BootのRESTful APIを実装
おすすめ書籍
JPAに関して体系的に学べる良い書籍だと思います。良くあるSpring系書籍ですとJPAは少ししか紹介がありませんが丸々一冊JPAに関してなので詳細な解説がされています。内容はJPAと他のORMとの比較から始まりセットアップ、実装の仕方まで幅広く網羅されています。これからJPAで開発を初めてみようかなと考えている方は一読することをオススメします!
Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す