Android Studio 1.0でrobospock-pluginが軒並み動かないので直して使う(差分はPR済)。
RoboSpockの導入方法について日本語があんまり見当たらないのでメモっとこうと思ったら以下の環境で動かなかったので色々やった結果結局Pull Request投げる事になった。
- Android Studio 1.0.1
- gradle 2.2.1-all
com.android.tools.build:gradle:1.0.0se.centril.robospock:gradle-plugin-robospock:1.0.0(本家のpluginが動かないので有志が別途用意したもの)
一旦エラーに出会うまでのセットアップを書く。その後pluginをcloneして修正して使う方法を解説する。
moduleを新規作成する
robospock用にappモジュールとは別にモジュールを作る。通常のAndroidアプリケーションで「No Activity」とかで作ればいいと思う。
ここではapp-testモジュールを作ったこととする。
app-test/build.gradleに色々書く
本家のドキュメントではrobospock-pluginを使えと書いてあるけど、ずいぶん前から更新がなく最新のAndroid Studioっていうかandroid gradle pluginでは動かなくなってしまっている。そこで本家のissueに投稿された最新環境で使えるpluginを試す。
FYI: New robospock plugin for Gradle · Issue #28 · Polidea/RoboSpock · GitHub
Centril/gradle-plugin-robospock · GitHub
app-test/build.gradleは以下となる。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
classpath 'se.centril.robospock:gradle-plugin-robospock:1.0.0'
}
}
repositories {
mavenCentral()
}
apply plugin: 'groovy'
dependencies {
compile "org.codehaus.groovy:groovy-all:1.8.6"
}
apply plugin: 'robospock'
robospock {
android = project(':app')
}
しかしこのbuild.gradleをsyncすると以下のエラーが起こる。
Error:(25, 0) Cause: multiple points
問題の原因
これはgradle-plugin-robospockがgradleのバージョンチェックをしようとして死んでいる。android gradle plugin 1.0.0ではgradle-2.2.1を要求する。gradle-plugin-robospockではgradle-2.2以上である事を判定しているがこの判定処理に誤りがある。
実際のコードは以下の通り。v.toFloat()で"2.2.1"など点が2つ以上ある文字列を食わせると死ぬ。
private static void checkGradleVersion( RoboSpockConfiguration cfg ) { // Check gradle version, ensure >= 2.2. def v = cfg.perspective.gradle.gradleVersion if ( v.toFloat() < 2.2 ) { throw new GradleException( "RoboSpock requires gradle >= 2.2, but current is: $v" ) } }
gradle-plugin-robospockを修正して使う
判定処理をちょっと直せば動くのでもうcloneして直して使う。修正ファイルと修正後のコードは以下の通り。
gradle-plugin-robospock/plugin/src/main/groovy/se/centril/robospock/RoboSpockAction.groovy
private static void checkGradleVersion( RoboSpockConfiguration cfg ) { // Check gradle version, ensure >= 2.2. def v = cfg.perspective.gradle.gradleVersion if ( "2.2".compareTo(v) > 0 ) { throw new GradleException( "RoboSpock requires gradle >= 2.2, but current is: $v" ) } }
以下のコマンドでビルドしてjarを作成する。
./gradlew jar
以下の場所にjarファイルができる。
gradle-plugin-robospock/plugin/libs/gradle-plugin-robospock-1.0.0.jar
このjarをapp-test/libsにコピーしておく。
その後app-test/build.gradleを修正する。差分はflatDirと、dependenciesのgroup id。
buildscript {
repositories {
flatDir dirs: "libs" //<-ここ
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
//↓ここ。group idのprefixに"local"を足している。キャッシュがぶつかるのを防ぐ為。
classpath 'local.se.centril.robospock:gradle-plugin-robospock:1.0.0'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
}
}
repositories {
mavenCentral()
}
apply plugin: 'groovy'
dependencies {
compile "org.codehaus.groovy:groovy-all:1.8.6"
}
apply plugin: 'robospock'
robospock {
android = project(':app')
}
動かす
これであとはテスト書いて動かすだけ。
./gradlew app-test:test
PRマージされてmavenかjcenterに拝承されるといいなー
※追記
マージされた。1.0.1が出るようです。(∩´∀`)∩ワーイ