2016-06-02 1 views
5

Я пытаюсь добавить среду тестирования Espresso в свой проект. Тем не менее, я застрял с этим NoClassDefFoundError в течение 3 дней. После поиска в Google я обнаружил, что тестирование APK использует по умолчанию тип сборки DEBUG. По какой-то причине мне нужно установить Proguard для типа отладки. Тем не менее, я получаю следующее сообщение об ошибке при запуске моей тестовой конфигурации:NoClassDefFoundError для Android Внутренний кинжал эспрессо заводского класса

06-02 15:27:01.105 19436-19457/com.lingyue.YqgAndroid E/TestLoader: Could not find class: android.support.test.espresso.base.UiControllerModule_ProvideUiControllerFactory 
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.core.deps.dagger.internal.Factory> 
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.base.ViewFinderImpl_Factory> 
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.base.ViewFinderImpl_Factory> 
06-02 15:27:01.109 19436-19457/com.lingyue.YqgAndroid E/TestLoader: Could not find class: android.support.test.espresso.base.ViewFinderImpl_Factory 
06-02 15:27:01.114 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.core.deps.dagger.internal.Factory> 
06-02 15:27:01.115 19436-19457/com.lingyue.YqgAndroid E/AndroidRuntime: FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner 
    Process: com.lingyue.YqgAndroid, PID: 19436 
    java.lang.NoClassDefFoundError: android.support.test.espresso.core.deps.dagger.internal.Factory 
    at java.lang.Class.classForName(Native Method) 
    at java.lang.Class.forName(Class.java:324) 
    at android.support.test.internal.runner.TestLoader.doLoadClass(TestLoader.java:92) 
    at android.support.test.internal.runner.TestLoader.loadIfTest(TestLoader.java:113) 
    at android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(TestRequestBuilder.java:801) 
    at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:747) 
    at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:354) 
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:260) 
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879) 

Мой build.gradle выглядит любит это для зависимостей:

dependencies { 
    compile "com.android.support:cardview-v7:${supportVersion}" 
    compile "com.android.support:recyclerview-v7:${supportVersion}" 
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' 
    compile 'com.loopj.android:android-async-http:1.4.9' 
    compile 'com.qiniu:qiniu-android-sdk:7.0.9' 
    compile 'com.mcxiaoke.gradle:packer-helper:1.0.4' 
    compile 'me.henrytao:smooth-app-bar-layout:23.2.1.1' 
    compile 'com.alipay.euler:andfix:[email protected]' 
    compile 'com.umeng.analytics:analytics:6.0.0' 
    compile fileTree('libs') 
    compile project(':framework') 
    compile project(':yqdsdk') 

    // Only needed at compilation 
    provided 'com.google.dagger:dagger-compiler:2.0' 
    provided 'org.glassfish:javax.annotation:10.0-b28' 

    // For testing 
    androidTestCompile "com.android.support:support-annotations:${supportVersion}" 
    androidTestCompile 'com.android.support.test:runner:0.5' 
    androidTestCompile 'com.android.support.test:rules:0.5' 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') { 
     exclude group: 'javax.inject' 
    } 
} 

Типы Построить выглядеть следующим образом:

buildTypes { 
    debug { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     testProguardFile 'test-proguard-rules.pro' 
    } 

    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

testProguardFile.pro выглядит следующим образом:

-dontobfuscate 
-dontwarn 

Что я сделал:

  1. Если я переключаю Proguard от для отладочных, установив minifyEnabled = ложь, тест проходит успешно . Я получаю ошибку выше в противном случае.
  2. Я попытался поместить testProguardFile под «defaultConfig» и «debug», но безрезультатно.
  3. Я попытался добавить еще один тип сборки «uiTest» с Proguard, но тестовая конфигурация не будет работать после того, как я установил testBuildType в «uiTest». Ошибка в том, что Android Studio не распознает тестовый бегун AndroidJUnitRunner.

Мне кажется, что проблема связана с использованием прогейдера и кинжалом 2, но у меня заканчиваются идеи. Пожалуйста помоги.

С наилучшими пожеланиями

+0

Привет, я просто столкнулся с одной и той же проблемой. Пытается запустить тесты с помощью ProGuard, но тесты с этим исключением. У меня также есть отдельный тестовый файл ProGuard с аналогичными правилами. Николас, тебе удалось найти решение этой проблемы? – ivacf

ответ

0

После выполнения дополнительных исследований, я нашел решение этой проблемы, хотя, который не прямо вперед:

  1. Добавить новый тип сборки и синхронизировать Постройте проект, например,

    uiTest { minifyEnabled правда }

  2. На левой вниз стороне Android Studio, нажмите на кнопку "Построить Варианты". Для вашего прикладного модуля выберите новый добавленный вариант сборки, например. "UiTest".

  3. Запуск приложения.

Это несколько неудобно, потому что вам нужно переключаться туда и обратно, когда вам нужно протестировать различные варианты сборки. Но он запускает Expresso.