Android Dagger代码给出NoClassDefFoundError当运行浓缩咖啡测试时,正常运行工作正常

Android Dagger代码给出NoClassDefFoundError当运行浓缩咖啡测试时,正常运行工作正常,android,android-testing,dagger,android-espresso,Android,Android Testing,Dagger,Android Espresso,开始探索浓缩咖啡2.0,但似乎遇到了问题。我无法让测试成功地运行在任何项目,包括匕首。当我运行测试时,我得到以下异常(最后是整个stacktrace): 应用程序在未从AndroidInstrumentationTest运行时运行 以下是一些相关文件,我还将项目上传到github,以便更快地签出/复制 build.gradle: apply plugin: 'com.android.application' android { compileSdkVersion 21 buil

开始探索浓缩咖啡2.0,但似乎遇到了问题。我无法让测试成功地运行在任何项目,包括匕首。当我运行测试时,我得到以下异常(最后是整个stacktrace):

应用程序在未从AndroidInstrumentationTest运行时运行

以下是一些相关文件,我还将项目上传到github,以便更快地签出/复制

build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.pdt.daggerexample"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
        }


    }

    packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.jakewharton:butterknife:5.1.1'
    compile 'com.squareup.dagger:dagger:1.2.2'
    provided 'com.squareup.dagger:dagger-compiler:1.2.2'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
}
测试:

堆栈跟踪:

    12-24 15:18:17.986    1282-1282/? E/MonitoringInstrumentation﹕ Dying now...
    12-24 15:18:17.986    1282-1282/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
        java.lang.NoClassDefFoundError: com/pdt/daggerexample/model/DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter
                at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:28)
                at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:13)
                at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
                at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138)
                at dagger.ObjectGraph.create(ObjectGraph.java:129)
                at com.pdt.daggerexample.inject.DaggerExampleApplication.onCreate(DaggerExampleApplication.java:16)
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
                at android.app.ActivityThread.access$1300(ActivityThread.java:130)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4745)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                at dalvik.system.NativeStart.main(Native Method)
         Caused by: java.lang.ClassNotFoundException: com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter
                at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
                at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:28)
                at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:13)
                at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
                at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138)
                at dagger.ObjectGraph.create(ObjectGraph.java:129)
                at com.pdt.daggerexample.inject.DaggerExampleApplication.onCreate(DaggerExampleApplication.java:16)
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
                at android.app.ActivityThread.access$1300(ActivityThread.java:130)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4745)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                at dalvik.system.NativeStart.main(Native Method)

这件事让我有点紧张。您可能需要从espresso依赖项中排除javax.inject。Android的早期版本似乎对相同的依赖性不那么宽容

大致如下:

androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') {
    exclude group: 'javax.inject'
}
小心,这可能会咬到你全身。emulator设备日志中有一些关于冲突发生位置的有用提示。例如:

(Ldagger/internal/Binding; had used a different Ljavax/inject/Provider; during pre-verification) 


我通过向gradle添加以下代码解决了此问题:

configurations {
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4'
}

我刚刚运行了你的测试,效果很好…@Emmanuel什么版本的AS(或者如果命令行是什么命令),针对什么设备(AVD或实际插入的设备)?我已经重新克隆了它好几次,每次都会遇到错误。我认为它是0.9.3版本的,运行的是Genymotion-Nexus5Lollipop@Emmanuel谢谢,看起来这是旧的API级别AVD的问题。它现在对你有用吗?谢谢-这很有用-但是你能给出一些背景说明为什么吗?我不明白为什么这有助于解决问题。谢谢,我被困在这个问题上了。对于ligi,这是一个名称空间问题,您不能在一个构建中包含相同的包/名称空间两次。因此,您告诉测试编译器不要在javax.inject中构建,因为dagger将引入该名称空间
androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') {
    exclude group: 'javax.inject'
}
(Ldagger/internal/Binding; had used a different Ljavax/inject/Provider; during pre-verification) 
DexOpt: not resolving ambiguous class 'Ljunit/framework/TestSuite;'
configurations {
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4'
}