7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Data Binding ライブラリと Espresso の組み合わせで Instrumented tests 中に予期せず落ちることがある問題の対応 (workaround)

Last updated at Posted at 2016-04-05

Data binding ライブラリを使っている Android アプリを Espresso と組み合わせて (?) instrumented tests (./gradlew connectedAndroidTest) を実行すると、以下のような例外でテストに失敗することがある。

java.lang.ClassCastException: java.lang.String cannot be cast to <our.app.DataBindingType>

発生する問題

私が実際に遭遇したのは以下のようなエラー。

your.app.package.id.TargetActivityTest > yourTestMethodName[Nexus 5 - 6.0.1] FAILED
        java.lang.RuntimeException: Unable to start activity ComponentInfo{your.app.package.id/your.app.package.id.TargetActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to your.app.package.id.databinding.ActivityTargetBinding
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)

Tests on Nexus 5 - 6.0.1 failed: Instrumentation run failed due to 'java.lang.ClassCastException'
:app:connectedDebugAndroidTest FAILED

報告

以下で報告されている。

私は遭遇していないのだけれど、以下のようなエラーが出ることもある模様。

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
    at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:31)
    at com.espresso.databinding.MainActivity.onCreate(MainActivity.java:15)

対応

上記ページに workaround が書かれていた。 どうやら Data Binding のためのタスクが androidTest 向けにも動いていて、それが原因でおかしくなってるぽい。

上記ページの workaround をもとに、以下のようなコードを build.gradle に書いてとりあえず回避した。

project.afterEvaluate {
    def targetTasks = tasks.findAll({ it.name ==~ /\AdataBindingExportBuildInfo.*AndroidTest\z/ }).each {
        it.deleteAllActions()
    }
    // 将来予期せず動作しなくなるなどしたときのために例外を投げる。
    if (targetTasks.empty) throw new RuntimeException('対象となるタスクが存在しませんでした。 ' +
            'Data binding と Espresso の組み合わせのための workaround が不要になった可能性があります。 ' +
            'ビルドスクリプトを見直してください。')
}

dataBindingExportBuildInfoDebugAndroidTestdataBindingExportBuildInfoReleaseAndroidTest といったタスクの処理を全部無くしてしまうというもの。

将来タスク名が変更されたりして workaround のコードが動かなくなったときに気付くように例外を投げるようにしておいた。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?