java.lang.NoSuchMethodError: com.google.common.base.CharMatcher.whitespace () - PullRequest
0 голосов
/ 24 января 2019

Я пишу андроид юнит-тесты с Robolectric. Когда я запускаю свои тесты в настоящее время, я продолжаю получать вышеуказанную ошибку.

Я посмотрел и попробовал множество предложенных решений, но ни одно из них не устранило эту ошибку.

Пока я посмотрел на дерево зависимостей и вижу две версии гуавы:

+--- com.google.guava:guava-jdk5:13.0@jar
+--- com.google.guava:guava:27.0.1-android@jar

Заметив это, я попытался:

  1. исключить первую зависимость

    buildscript {
      repositories {
      google()
      jcenter()
     }
       dependencies {
       classpath 'com.android.tools.build:gradle:3.0.1'
       classpath 'com.google.gms:google-services:4.0.1'
       classpath ('org.robolectric:robolectric:4.1') {
        exclude group: 'com.google.guava', module: 'guava-jdk5'
       }
    
      }
    }
    
  2. обновить версию гуавы до последней

    api 'com.google.guava:guava:27.0.1-android'
    

Вот как выглядит ошибка:

java.lang.NoSuchMethodError: com.google.common.base.CharMatcher.whitespace()Lcom/google/common/base/CharMatcher;

at org.robolectric.res.StringResources.processStringResources(StringResources.java:19)
at org.robolectric.res.StaxValueLoader.onEnd(StaxValueLoader.java:33)
at org.robolectric.res.StaxDocumentLoader.doParse(StaxDocumentLoader.java:66)
at org.robolectric.res.StaxDocumentLoader.loadResourceXmlFile(StaxDocumentLoader.java:30)
at org.robolectric.res.DocumentLoader.loadFile(DocumentLoader.java:48)
at org.robolectric.res.DocumentLoader.load(DocumentLoader.java:27)
at org.robolectric.res.ResourceTableFactory.parseResourceFiles(ResourceTableFactory.java:149)
at org.robolectric.res.ResourceTableFactory.lambda$newFrameworkResourceTable$0(ResourceTableFactory.java:26)
at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:50)
at org.robolectric.res.ResourceTableFactory.newFrameworkResourceTable(ResourceTableFactory.java:12)
at org.robolectric.internal.SdkEnvironment.getSystemResourceTable(SdkEnvironment.java:35)
at org.robolectric.ApkLoader.getSystemResourceTable(ApkLoader.java:32)
at org.robolectric.android.internal.ParallelUniverse.injectResourceStuffForLegacy(ParallelUniverse.java:252)
at org.robolectric.android.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:126)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:379)
at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:252)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:130)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:42)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:84)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

А это мой тестовый класс:

@RunWith(RobolectricTestRunner.class)
public class MyTestClass {

MyTestFragment myTestFragment;

 @Test
public void fragmentIsNotNull() throws Exception{
    myTestFragment = MyTestFragment.newInstance();
    assertNotNull(myTestFragment);
  }
}

Буду признателен за любую помощь в этом. Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

Я наконец смог заставить это работать, следуя ответу, данному здесь на SO от кого-то с подобной проблемой.

Проблема заключалась в двух конфликтующих зависимостях гуавы, как я указывал выше.

+--- com.google.guava:guava-jdk5:13.0@jar
+--- com.google.guava:guava:27.0.1-android@jar

Это то, что я пробовал раньше, чтобы исключить гуаву,

configurations {
        all*.exclude group: 'com.google.guava', module:'guava-jdk5'
      }

Но зависимость от guava-jdk-5 все еще сохранялась.

Итак, я наконец добавил это в свой файл Gradle:

compile('com.google.guava:guava-jdk5:17.0') { force = true }

Это то, что окончательно решило ошибку.

...