導入しようとしたけどうまくいかなかった話です。
環境
'com.android.tools.build:gradle:3.0.0'
'com.android.support.test.espresso:espresso-core:3.0.1'
'com.android.support.test:runner:1.0.1'
'com.squareup.rx.idler:rx1-idler:0.9.0'
RxIdler
RxIdlerは、EspressoのIdlingResourceを使って、RxJavaのSchedulerをいい感じに待ってくれるライブラリです。
RxJavaPluginsを利用することで、プロダクションコードに変更を加えずに導入ができます。
導入
READMEにある通り、TestRunnerを自作します。
class MyTestRunner : AndroidJUnitRunner() {
override fun onStart() {
RxJavaPlugins.getInstance().registerSchedulersHook(RxIdler.hooks())
super.onStart()
}
}
これだけで良いはずが・・・
Pre-Lollipopでは、NoClassDefFoundでテストが失敗しました。
MultiDex対応
とりあえず、Test multidex appsの通りやってみます。
だが、これでも変わらずだったので、Declare classes required in the primary DEX fileにあるmultiDexKeepProguardを使います。
これに記述したクラスは、最初に読み込まれるDEXに含まれるようになります。
android {
buildTypes {
release {
multiDexKeepProguard 'multidex-config.pro'
...
}
}
}
-keep class rx.functions.Action0
-keep class rx.plugins.RxJavaPlugins
-keep class com.squareup.rx.idler.RxIdler
これでNoClassDefFoundは発生しなくなりました。
Issue
全体のテストを実施していたら、このIssueを踏みました。
まとめ
他にも
- Proposal to add RxIdlingResource for Espresso testingの例を使う
-
AsyncTaskのExecutorを使う -
Schedulerを自作する
とかやってみましたが、どれもうまくは行かなかった。
根本が間違ってる可能性もありますが、時間的に諦めることにしました。