visible true

技術的なメモを書く

Android Studio 1.0でrobospock-pluginが軒並み動かないので直して使う(差分はPR済)。

Polidea/RoboSpock · GitHub

RoboSpockの導入方法について日本語があんまり見当たらないのでメモっとこうと思ったら以下の環境で動かなかったので色々やった結果結局Pull Request投げる事になった。

  • Android Studio 1.0.1
  • gradle 2.2.1-all
  • com.android.tools.build:gradle:1.0.0
  • se.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が出るようです。(∩´∀`)∩ワーイ

Support multi point version name. by sys1yagi · Pull Request #13 · Centril/gradle-plugin-robospock · GitHub