匕首code给人的NoClassDefFoundError当居preSSO下的测试,正常运行工作正常 [英] Dagger code giving NoClassDefFoundError when Espresso Tests are run, normal run works fine

查看:274
本文介绍了匕首code给人的NoClassDefFoundError当居preSSO下的测试,正常运行工作正常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

开始探索居preSSO 2.0,但似乎遇到了一个嗝。我不能让测试成功对包括匕首任何项目运行。当我运行测试,我得到了以下异常(在最后整个堆栈跟踪):

  java.lang.NoClassDefFoundError的:COM / PDT / daggerexample /模型/ DaggerExampleAppModule $$ ModuleAdapter $ ProvideMySingletonProvidesAdapter
 

在应用程序运行时不会从AndroidInstrumentationTest运行。

下面是一些相关的文件,我也上载该项目Github上,以便更快地结帐/再现<一href="https://github.com/paul-turner/es$p$pssoDaggerExample">https://github.com/paul-turner/es$p$pssoDaggerExample.

build.gradle:

 应用插件:com.android.application

安卓{
    compileSdkVersion 21
    buildToolsVersion21.1.2

    defaultConfig {
        的applicationIDcom.pdt.daggerexample
        testInstrumentationRunnerandroid.support.test.runner.AndroidJUnitRunner
        的minSdkVersion 16
        targetSdkVersion 21
        版本code 1
        VERSIONNAME1.0
    }
    buildTypes {
        推出 {
            minifyEnabled假
            proguardFiles getDefaultProguardFile('ProGuard的-android.txt'),'proguard-rules.pro
        }
        调试{
            minifyEnabled假
        }


    }

    packagingOptions {
        排除的LICENSE.txt
        不包括META-INF /许可证
        不包括META-INF / LICENSE.TXT
        不包括META-INF /注意事项
        不包括META-INF / NOTICE.txt
        不包括META-INF /服务/ javax.annotation.processing.Processor
    }
}

依赖{
    编译文件树(导演:库,包括:['的* .jar'])
    编译com.android.support:appcompat-v7:21.0.3
    编译com.jakewharton:butterknife:5.1.1
    编译com.squareup.dagger:短剑:1.2.2
    提供com.squareup.dagger:匕首编译:1.2.2
    androidTestCompilecom.android.support.test.es preSSO:ES preSSO核心:2.0
    androidTestCompilecom.android.support.test:测试支持-lib目录下:0.1
}
 

测试:

 公共类SampleEs pressoTest延伸ActivityInstrumentationTestCase2&LT; MainActivity&GT; {

    公共SampleEs pressoTest(){
        超(MainActivity.class);
    }

    @覆盖
    公共无效设置()抛出异常{
        super.setUp();
        //居preSSO不会推出我们的活动对我们来说,我们必须通过getActivity启动它()。
        getActivity();
    }

    公共无效testCheckText(){
        OnView为(ViewMatchers.withId(com.pdt.daggerexample.R.id.es presso_test))
                。检查(火柴(withText(ES preSSO测试)));
    }
}
 

模块:

 包com.pdt.daggerexample.model;

进口com.pdt.daggerexample.inject.DaggerExampleApplication;
进口com.pdt.daggerexample.MainActivity;
进口com.pdt.daggerexample.SecondActivity;

进口javax.inject.Singleton;

进口dagger.Module;
进口dagger.Provides;

@Module(其注入= {
        MainActivity.class,
        SecondActivity.class,
},完整=真)

公共类DaggerExampleAppModule {

    私人最终DaggerExampleApplication mDaggerExampleApplication;

    公共DaggerExampleAppModule(DaggerExampleApplication daggerExampleApplication){
        mDaggerExampleApplication = daggerExampleApplication;
    }

    @Provides
    @Singleton
    公共MySingleton provideMySingleton(){
        返回新MySingleton(mDaggerExampleApplication.getApplicationContext(),FOOBAR!);
    }

    @Provides
    公共MyRegularOldClassInstance provideMyRegularOldClassInstance(){
        返回新MyRegularOldClassInstance();
    }

}
 

堆栈跟踪:

  12-24 15:18:17.986 1282年至1282年/? E / MonitoringInstrumentation:现在死亡...
    12-24 15:18:17.986 1282年至1282年/? E / AndroidRuntime:致命异常:主要
        java.lang.NoClassDefFoundError的:COM / PDT / daggerexample /模型/ DaggerExampleAppModule $$ ModuleAdapter $ ProvideMySingletonProvidesAdapter
                在com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:28)
                在com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:13)
                在dagger.ObjectGraph $ DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
                在dagger.ObjectGraph $ DaggerObjectGraph.access $ 000(ObjectGraph.java:138)
                在dagger.ObjectGraph.create(ObjectGraph.java:129)
                在com.pdt.daggerexample.inject.DaggerExampleApplication.onCreate(DaggerExampleApplication.java:16)
                在android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
                在android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
                在android.app.ActivityThread.access $ 1300(ActivityThread.java:130)
                在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1255)
                在android.os.Handler.dispatchMessage(Handler.java:99)
                在android.os.Looper.loop(Looper.java:137)
                在android.app.ActivityThread.main(ActivityThread.java:4745)
                在java.lang.reflect.Method.invokeNative(本机方法)
                在java.lang.reflect.Method.invoke(Method.java:511)
                在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
                在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                在dalvik.system.NativeStart.main(本机方法)
         抛出java.lang.ClassNotFoundException:com.pdt.daggerexample.model.DaggerExampleAppModule $$ ModuleAdapter $ ProvideMySingletonProvidesAdapter所致
                在dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
                在java.lang.ClassLoader.loadClass(ClassLoader.java:501)
                在java.lang.ClassLoader.loadClass(ClassLoader.java:461)
                在com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:28)
                在com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:13)
    在dagger.ObjectGraph $ DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
    在dagger.ObjectGraph $ DaggerObjectGraph.access $ 000(ObjectGraph.java:138)
    在dagger.ObjectGraph.create(ObjectGraph.java:129)
    在com.pdt.daggerexample.inject.DaggerExampleApplication.onCreate(DaggerExampleApplication.java:16)
    在android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
    在android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
    在android.app.ActivityThread.access $ 1300(ActivityThread.java:130)
    在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1255)
    在android.os.Handler.dispatchMessage(Handler.java:99)
    在android.os.Looper.loop(Looper.java:137)
    在android.app.ActivityThread.main(ActivityThread.java:4745)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:511)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    在dalvik.system.NativeStart.main(本机方法)
 

解决方案

这个问题让我一会儿。您可能需要从ES preSSO依赖排除javax.inject。早期版本的Andr​​oid似乎是不能忍受相同的依赖关系。

线沿线的东西:

  androidTestCompile('com.android.support.test.es preSSO:ES preSSO核心:2.0'){
    排除组:javax.inject
}
 

要注意的是这可以咬你所有的地方。模拟器设备记录有关于那里的冲突正在发生一些有益的启示。例如:

 (Ldagger /内部/约束力;曾用不同的Ljavax /注入/供应商;在pre-验证)
 

  DexOpt:不解决不明确的类的Ljunit /框架/ TestSuite的;
 

Started exploring Espresso 2.0, but seem to have run into a hiccup. I cannot get the tests to successfully run against any project which includes Dagger. When I run the tests I get the following Exception (entire stacktrace at the end):

java.lang.NoClassDefFoundError: com/pdt/daggerexample/model/DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter

The application runs when not running from the AndroidInstrumentationTest.

Here are some of the relevant files, I've also uploaded the project to github to allow for a quicker checkout/reproduction https://github.com/paul-turner/espressoDaggerExample.

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'
}

Test:

public class SampleEspressoTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public SampleEspressoTest() {
        super(MainActivity.class);
    }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        // Espresso will not launch our activity for us, we must launch it via getActivity().
        getActivity();
    }

    public void testCheckText() {
        onView(ViewMatchers.withId(com.pdt.daggerexample.R.id.espresso_test))
                .check(matches(withText("Espresso Test")));
    }
}

Module:

package com.pdt.daggerexample.model;

import com.pdt.daggerexample.inject.DaggerExampleApplication;
import com.pdt.daggerexample.MainActivity;
import com.pdt.daggerexample.SecondActivity;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

@Module(injects = {
        MainActivity.class,
        SecondActivity.class,
}, complete = true)

public class DaggerExampleAppModule {

    private final DaggerExampleApplication mDaggerExampleApplication;

    public DaggerExampleAppModule(DaggerExampleApplication daggerExampleApplication) {
        mDaggerExampleApplication = daggerExampleApplication;
    }

    @Provides
    @Singleton
    public MySingleton provideMySingleton() {
        return new MySingleton(mDaggerExampleApplication.getApplicationContext(), "FOOBAR!");
    }

    @Provides
    public MyRegularOldClassInstance provideMyRegularOldClassInstance() {
        return new MyRegularOldClassInstance();
    }

}

Stacktrace:

    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)

解决方案

This issue had me for a bit. You likely need to exclude javax.inject from the espresso dependency. Earlier versions of Android appear to be less tolerant of identical dependencies.

Something along the lines of:

androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') {
    exclude group: 'javax.inject'
}

Beware that this can bite you all over the place. The emulator device logs have some useful hints about where the collisions are taking place. E.g.:

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

or

DexOpt: not resolving ambiguous class 'Ljunit/framework/TestSuite;'

这篇关于匕首code给人的NoClassDefFoundError当居preSSO下的测试,正常运行工作正常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆