无法用Robolectric编译测试

时间:2014-10-09 09:46:07

标签: android junit gradle android-studio robolectric

我的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.10.0'
    }
}


apply plugin: 'android-sdk-manager'
apply plugin: 'android'
apply plugin: 'spoon'
apply plugin: 'robolectric'

android {
    compileSdkVersion 19
    buildToolsVersion '20.0.0'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        testInstrumentationRunner 'com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner'
    }


    buildTypes {
        debug {
        }
        release {
        }
    }

    productFlavors {
        first {
        //just version codes and packages
        }
        second {
        //just version codes and packages
        }
        third {
        //just version codes and packages  
        }
    }
}

spoon {
    debug = true
}

dependencies {
    compile project(':app:libs:facebookSDK')
    compile 'com.google.android.gms:play-services:5.0.89'
    compile 'com.android.support:support-v4:20.0.0+'
    compile 'com.google.code.gson:gson:2.2.4'
    compile fileTree(dir: 'libs', include: '*.jar')
    androidTestCompile fileTree(dir: 'libsTest', include: '*.jar')
    androidTestCompile 'com.squareup.spoon:spoon-client:1.1.0'
    androidTestCompile 'junit:junit:4.+'
    androidTestCompile 'org.robolectric:robolectric:2.3'
}

libsTest :espresso-contrib-1.1-bundled.jar

现在,我的错误如下:

Error Code:
    2
  Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/SelfDescribing;
      at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
      at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
      at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
      at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
      at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
      at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
      at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
      at com.android.dx.command.dexer.Main.run(Main.java:230)
      at com.android.dx.command.dexer.Main.main(Main.java:199)
      at com.android.dx.command.Main.main(Main.java:103)

此处提供更详细的日志:

http://pastebin.com/Yye3cd1c

如何解决此问题?

UPD :我现在的问题基本上是如何捕获这些重复的部分?

4 个答案:

答案 0 :(得分:1)

  

我现在的问题基本上是如何捕获那些重复的部分?

您可以使用日志执行此操作。你粘贴的日志说:

  

com.android.dex.DexException:多个dex文件定义

这很可能是由于冲突的库造成的。日志继续:

  

Lorg / hamcrest /自描述;

这是冲突的库, hamcrest

在向项目添加依赖项之后,如果库(或库)使用了公共子库,则会发生此错误。所以似乎 hamcrest 不仅被你的一个库使用了。

我们通过检查依赖关系来了解这种冲突。当然,有效的检查需要同时具有直观性和合理性。

让我们从 hamcrest 本身开始。 (我假设你以前没有听说过hamcrest。)

让我们来看看Hamcrest project page。 Hamcrest将自己定义为用于构建测试表达式的匹配器库。定义说典型场景包括测试框架,模拟库 ......这很有启发性,因为你对JUnit,Espresso和Robolectric等测试有一些依赖性。

现在我们应该继续使用JUnit dependencies。似乎JUnit使用 hamcrest-core Here是我们的第一个作为子依赖的锤子。

让我们继续使用Espresso,因为espresso-contrib-1.1-bundled.jar文件夹中有libsTest。 当我们查看espresso-contrib项目dependencies时,我们可以看到Espresso大量使用hamcrest。

我们可能会在您的项目中获得冲突的库,最后一步是在添加此依赖项时从我们的某个依赖项中排除hamcrest-core。您可以通过以下方式实现此目的:

androidTestCompile('junit:junit:4.+') {
    exclude module: 'hamcrest-core'
}

答案 1 :(得分:0)

我前一段时间遇到过类似的问题,如果我没记错的话,我通过添加一条排除声明修复了它,如下所示:

androidTestCompile('junit:junit:4.+') {
    exclude module: 'hamcrest-core'
}

答案 2 :(得分:0)

受到deckard-gradle sample project的启发,我建议尝试这样的事情:

androidTestCompile 'org.hamcrest:hamcrest-integration:1.1'
androidTestCompile 'org.hamcrest:hamcrest-core:1.1'
androidTestCompile 'org.hamcrest:hamcrest-library:1.1'

androidTestCompile('junit:junit:4.11') {
    exclude module: 'hamcrest-core'
}
androidTestCompile('org.robolectric:robolectric:2.3') {
    exclude module: 'classworlds'
    exclude module: 'commons-logging'
    exclude module: 'httpclient'
    exclude module: 'maven-artifact'
    exclude module: 'maven-artifact-manager'
    exclude module: 'maven-error-diagnostics'
    exclude module: 'maven-model'
    exclude module: 'maven-project'
    exclude module: 'maven-settings'
    exclude module: 'plexus-container-default'
    exclude module: 'plexus-interpolation'
    exclude module: 'plexus-utils'
    exclude module: 'wagon-file'
    exclude module: 'wagon-http-lightweight'
    exclude module: 'wagon-provider-api'
}

答案 3 :(得分:0)

捕获这些错误的一个技巧是使用Android Studio"导航>类..."选项。

鉴于您有此错误:

Lorg/hamcrest/SelfDescribing;

然后你可以搜索" org.hamcrest.SelfDescribing"所以你可以了解使用它的.jars。