過去に以下記事にて、Spock ライクにテストデータを表現することにチャレンジしてきました。
それでもまだ、col
、row
といった記述が残ってしまっており、より Spock ライクな記述に近づけることはできないかと考えていたところ、他にも似たようなことを試している方がいることに気が付き、参考にさせていただきました。参考にさせていただいたのは以下記事、およびプロジェクトです。
そして、完成したのがこちら。
テーブル名A {
列名A1 | 列名A2 | 列名A3 | ...
'行A1:値A1' | '行A1:値A2' | '行A1:値A3' | ...
'行A2:値A1' | '行A2:値A2' | '行A2:値A3' | ...
...
}
テーブル名B {
列名B1 | 列名B2 | 列名B3 | ...
'行B1:値B1' | '行B1:値B2' | '行B1:値B3' | ...
'行B2:値B1' | '行B2:値B2' | '行B2:値B3' | ...
...
}
実に Spock らしいデータ表現をできるようになりました。
以下では、DbSetup、DBUnit それぞれでの実際の使用方法について触れていきます。
環境
- Java 1.8.0_91
- Maven 3.3.9
- Groovy 2.4.7
- Spock 1.1-groovy-2.4-rc-1
- DbSetup 2.1.0
- DBUnit 2.5.3
$ ./mvnw --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /Users/yo1000/.m2/wrapper/dists/apache-maven-3.3.9-bin/2609u9g41na2l7ogackmif6fj2/apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.5", arch: "x86_64", family: "mac"
依存関係追加
pom.xml
に依存関係を追加します。DbSetup、または DBUnit のうち、いずれか使用する方を追加してください。(両方追加されていても支障ありません。)
以下抜粋。
<!-- dbspock -->
<dependency>
<groupId>com.yo1000</groupId>
<artifactId>dbspock-core</artifactId>
<version>2.0.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- for DbSetup -->
<dependency>
<groupId>com.yo1000</groupId>
<artifactId>dbspock-dbsetup</artifactId>
<version>2.0.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- for DBUnit -->
<dependency>
<groupId>com.yo1000</groupId>
<artifactId>dbspock-dbunit</artifactId>
<version>2.0.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Groovy spock -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.1-groovy-2.4-rc-1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>1.1-groovy-2.4-rc-1</version>
<scope>test</scope>
</dependency>
<!-- DbSetup -->
<dependency>
<groupId>com.ninja-squad</groupId>
<artifactId>DbSetup</artifactId>
<version>2.1.0</version>
<scope>test</scope>
</dependency>
<!-- DBUnit -->
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.5.3</version>
<scope>test</scope>
</dependency>
<repository>
<id>com.yo1000</id>
<name>yo1000 maven repository</name>
<url>http://yo1000.github.io/maven/</url>
</repository>
デモコード
実際のコードを確認します。ここでは、Spock を使用したテストコードの、setup
部分のみ抜粋して紹介します。
全文については、以下をご確認ください。
https://github.com/yo1000/dbspock/blob/master/dbspock-specs/src/test/groovy/com/yo1000/dbspock/DbspockSpec.groovy
DbSetup
DbSetup によるテストの場合は、以下のように記述します。
setup:
def insertOps = DbspockOperations.insertInto {
test_table {
test_int | test_str | test_date
100 | 'test1' | '2016-09-26 23:20:01.0'
200 | 'test2' | '2016-09-26 23:20:02.0'
300 | 'test3' | '2016-09-26 23:20:03.0'
}
}
def destination = new DriverManagerDestination(URL, USERNAME, PASSWORD)
new DbSetup(destination,
Operations.sequenceOf(
Operations.truncate('test_table'),
insertOps
)
).launch()
DBUnit
DBUnit によるテストの場合は、以下のように記述します。
setup:
def dataSet = DbspockLoaders.loadDataSet {
test_table {
test_int | test_str | test_date
100 | 'test1' | '2016-09-26 23:20:01.0'
200 | 'test2' | '2016-09-26 23:20:02.0'
300 | 'test3' | '2016-09-26 23:20:03.0'
}
}
def databaseTester = new JdbcDatabaseTester(Driver.class.getName(), URL, USERNAME, PASSWORD)
databaseTester.setUpOperation = DatabaseOperation.CLEAN_INSERT
databaseTester.dataSet = dataSet
databaseTester.onSetup()
おわりに
今回のリファクタで、より Spock ライクに自然なデータ表現が可能となりました。
またリファクタの折、実装の大きなヒントとなったコードを、MIT で公開してくださっていた @disc99 さんにも大変感謝しております。ありがとうございました!
より詳しい内容については、以下をご確認ください。
https://github.com/yo1000/dbspock