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
への参照を除外するといい。
dependencies {
...
implementation "com.google.apis:google-api-services-drive:v3-rev197-1.25.0"
...
}
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を追加するといけたとの投稿があった
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?