LoginSignup
0

More than 3 years have passed since last update.

robolectricのテストが NoSuchMethodError (com.google.common.collect) となるのを対処した

Posted at

Androidのアプリを開発していて、テストにroborectlic を導入してみたところ掲題のNoSuchMethodErrorが出たので調査して解決した。
私の場合 com.google.common.collect.ImmutableList.sortedCopyOf が無いというエラーだった。

TL;DR

作成しているアプリケーションがcom.google.apisなどcom.google.api-clientに依存したものを使用している場合、更に依存先であるcom.google.guavaのバージョンが古い可能性があるので、com.google.apis側で com.google.guavaへの参照を除外するといい。

build.gradle(変更前)
dependencies {
    ...
    implementation "com.google.apis:google-api-services-drive:v3-rev197-1.25.0"
    ...
}
build.gradle(変更後)
dependencies {
    ...
    implementation ("com.google.apis:google-api-services-drive:v3-rev197-1.25.0"){
        exclude group: 'com.google.guava'
    }
    ....
}

関連

依存関係のツリーを表示するコマンド

> ./gradlew app:dependencies

この結果をcom.google.guava等で検索すると使っているパッケージとバージョン分かる

依存にapiを追加するパターン?

このIssue[1] にはapiを追加するといけたとの投稿があった

build.grade
dependencies {
    ...
    api 'com.google.guava:guava:30.0-android'
    ...
}

これでもいけた。apiでなくimplementationでもいけた。
ただバージョンによってはアプリ実行時にDuplicate class のエラーが出ることがあった。
その場合、stackoverflowの投稿[2] によると以下のものも依存に入れると良いらしい。※深く調べてない

implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

場合により使い分けが必要かもしれない。

関連リンク

[1] github.com robolectric/robolectric 4.3: NoSuchMethodError ImmutableList.sortedCopyOf
[2] stackoverflow.com Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules guava-20.0.jar (com.google.guava:guava:20.0)
[3] stackoverflow.com Why does google-api-client depend on guava-jdk5?

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
0