2014-12-24 18 views
14

Bắt đầu khám phá Espresso 2.0, nhưng dường như đã chạy vào một trục trặc. Tôi không thể có được các bài kiểm tra để chạy thành công với bất kỳ dự án nào bao gồm Dagger. Khi tôi chạy thử nghiệm, tôi nhận được Ngoại lệ sau (toàn bộ stacktrace ở cuối):Mã Dagger cho NoClassDefFoundError khi Kiểm tra Espresso được chạy, hoạt động bình thường hoạt động tốt

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

Ứng dụng chạy khi không chạy từ AndroidInstrumentationTest.

Dưới đây là một số tệp có liên quan, tôi cũng đã tải dự án lên github để cho phép thanh toán/sinh sản nhanh hơn 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) 
+0

Tôi chỉ cần chạy thử nghiệm của bạn và nó hoạt động tốt ... – Emmanuel

+0

@ Emmanuel Phiên bản nào của AS (hoặc nếu lệnh dòng lệnh nào), chống lại thiết bị nào (thiết bị AVD hoặc thiết bị thực tế được cắm vào)? Tôi đã nhân bản nó một vài lần và chạy vào lỗi mỗi lần. – pturner

+0

Tôi nghĩ rằng đó là AS 0.9.3 và đó là Genymotion - Nexus 5 chạy Lollipop – Emmanuel

Trả lời

21

Sự cố này đã cho tôi một chút. Bạn có thể cần phải loại trừ javax.inject khỏi sự phụ thuộc của espresso. Các phiên bản trước của Android dường như ít chịu được sự phụ thuộc giống hệt nhau.

cái gì đó dọc theo dòng:

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

Ghi chú rằng điều này có thể cắn tất cả các bạn khắp nơi. Nhật ký thiết bị mô phỏng có một số gợi ý hữu ích về nơi xảy ra xung đột. Ví dụ:

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

hoặc

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

Cảm ơn - công việc này - nhưng bạn có thể đưa ra một số lý do tại sao? Tôi bối rối vì sao điều này giúp giải quyết vấn đề .. – ligi

+0

Cảm ơn bạn, đã bị mắc kẹt về vấn đề này. Đối với ligi nó là một vấn đề không gian tên, bạn không thể bao gồm cùng một gói/không gian tên trong một bản dựng hai lần. Vì vậy, bạn cho trình biên dịch thử nghiệm không xây dựng trong javax.inject vì dao găm sẽ mang vào không gian tên đó – Scrotos

0

Tôi đã giải quyết vấn đề này thêm vào gradle đoạn mã sau:

configurations { 
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4' 
} 
Các vấn đề liên quan