Robolectric 3.0-SNAPSHOT

Robolectricに慣れてきたところで、API21のプロジェクトに投入してみます。今日時点のリリースバージョンである2.4ではAPI18までの対応になっていて、API19および21に設定するとエラーで止まるようになってます。Roboは、Androidの下層をさわろうとするクラスを特定してバイトコードエンジニアリングで(彼らの言うところの)Shadowオブジェクトに差し替えてるので、仕組み的にAPIバージョンにはセンシティブみたいですね。

SlideShareで過去のプレゼンをみるとRoboはJavassistを使ってバイトコードエンジニアリングしてるというようなことも書いてありましたが今はその痕跡無いみたい。JavassistMayaaの恩人である東工大の千葉先生の作品で、その後の関連プロジェクトたるGlueonJでは、Gluegentが仕事としてもらってお手伝いしたことがあったために思い入れあるので目につきました。なんと10年近く前の話です。

RobolectricのGithubを見ると開発中の3.0についてはAPI21まで対応しているので、この最新開発版を使ってテストしたいと思います。早晩にリリースもされるでしょうしね。:appのbuild.gradleをちょっと変更。jcenterとmavenCentoralでも持ってなかったけど、jboss.orgが3.0−SNAPSHOTをホストしてました。はて、なんでJBossJavassistつながり?JavassistJBossの傘下ということになってましたが。

android {
 // 変更ないところは省略
    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 21
    }
}

repositories {
    maven {
        url 'https://repository.jboss.org'
    }
}

dependencies {
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile('org.robolectric:robolectric:3.0-SNAPSHOT') {
        exclude group: 'commons-logging'
    }

    // compile 省略
}

こちらでもcommons-loggingで警告でるので外してますが、org.apache.httpcomponentsは警告でなくなりました。なんでだろうとapp.imlを見るとそもそも外れてます。

2.4 to 3.0 Upgrade Guide (Draft) · robolectric/robolectric Wiki · GitHub

記事ドラフトをみるとhttpclientのShadow化について書いてあるから、このことが作用したのかな?プロジェクト内部用語で書かれてるのでしかとはわかりかねますけど。