匕首code给人的NoClassDefFoundError当居preSSO下的测试,正常运行工作正常 [英] Dagger code giving NoClassDefFoundError when Espresso Tests are run, normal run works fine
问题描述
开始探索居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。早期版本的Android似乎是不能忍受相同的依赖关系。
线沿线的东西:
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屋!