導入しようとしたけどうまくいかなかった話です。
環境
'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に含まれるようになります。
app/build.gradle
android {
buildTypes {
release {
multiDexKeepProguard 'multidex-config.pro'
...
}
}
}
app/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
を自作する
とかやってみましたが、どれもうまくは行かなかった。
根本が間違ってる可能性もありますが、時間的に諦めることにしました。