Тесты Android не запускаются на устройстве ниже 5 (API 21) NoClassDefFoundError

Я пытаюсь запустить инструментальные тесты для своего проекта. Но они не работают на устройствах (в том числе и на эмуляторах) с версией ниже 5 (API 21).

Я пытался решить эту проблему, но все еще сталкиваюсь с ней. Я получаю следующее исключение.

02-15 10:46:08.965 1127-1143/? E/AndroidRuntime: FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
                                                 java.lang.ExceptionInInitializerError
                                                     at android.support.test.internal.runner.TestRequestBuilder.<init>(TestRequestBuilder.java:81)
                                                     at android.support.test.internal.runner.TestRequestBuilder.<init>(TestRequestBuilder.java:524)
                                                     at android.support.test.runner.AndroidJUnitRunner.createTestRequestBuilder(AndroidJUnitRunner.java:379)
                                                     at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:352)
                                                     at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:269)
                                                     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
                                                  Caused by: java.lang.NoClassDefFoundError: org.junit.runner.manipulation.Filter$1
                                                     at org.junit.runner.manipulation.Filter.<clinit>(Filter.java:21)
                                                     at android.support.test.internal.runner.TestRequestBuilder.<init>(TestRequestBuilder.java:81) 
                                                     at android.support.test.internal.runner.TestRequestBuilder.<init>(TestRequestBuilder.java:524) 
                                                     at android.support.test.runner.AndroidJUnitRunner.createTestRequestBuilder(AndroidJUnitRunner.java:379) 
                                                     at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:352) 
                                                     at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:269) 
                                                     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584) 

Я уже пробовал все решения для подобных вопросов.

Вот как выглядит структура моего проекта.

структура проекта

И градиентные зависимости для тестов

  /************* TEST STUFF ***************/
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile fileTree(include: ['robotium-solo-5.5.2.jar'], dir: 'libs')
    //mockito dependencies
    androidTestCompile 'org.mockito:mockito-core:2.7.6'
    androidTestCompile files('libs/dexmaker-mockito-1.0.jar')
    androidTestCompile files('libs/dexmaker-1.0.jar')

    // Set this dependency to build and run Espresso tests
    androidTestCompile('com.android.support.test.espresso:espresso-core:+') {
        exclude group: 'com.android.support', module: 'support-annotations'
    }

    androidTestCompile('com.android.support.test:runner:0.5') {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    // Set this dependency to use JUnit 4 rules
    androidTestCompile('com.android.support.test:rules:+') {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestCompile('com.android.support.test.espresso:espresso-intents:+') {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    //MockWebServer - Version 2.2 of mockwebserver doesn't work because of an issue, so forcing v2.1 - https://github.com/square/okhttp/issues/1069
    androidTestCompile('com.squareup.okhttp3:mockwebserver:+') {
        exclude module: 'okhttp'
    }
    androidTestCompile "org.slf4j:slf4j-api:1.7.12"
    //WireMock
    androidTestCompile("com.github.tomakehurst:wiremock:2.5.0") {
        //Using Android Version Instead
        exclude group: 'org.apache.httpcomponents', module: 'httpclient'

        //Version conflict with our app's slf4j version
        exclude group: 'org.slf4j', module: 'slf4j-api'

        //Was getting a classpath conflict for org.objectweb.asm.AnnotationVisitor which is a part of 'net.minidev:asm'
        exclude group: 'org.ow2.asm', module: 'asm'

        //Was getting this warning, so decided to ignore this version included by WireMock.
        //Warning:Dependency org.json:json:20090211 is ignored as it may be conflicting with the internal version provided by Android.
        //In case of problem, please repackage with jarjar to change the class packages
        exclude group: 'org.json', module: 'json'
    }
    androidTestCompile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'

И BaseTestClass имеют следующую структуру

@RunWith(AndroidJUnit4.class)
public abstract class InstrumentalSuperTest {

    private SystemAnimations mSystemAnimations;

    @Rule
    public IntentsTestRule rule = provideActivity();

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(WireMockConfiguration.wireMockConfig().port(BuildConfig.PORT), false);

    protected abstract IntentsTestRule provideActivity();

}

И это происходит не только с моим проектом, но и с примерами Wiremock, та же ошибка.

Возможно, я неправильно запускаю тест, я просто нажимаю на тестовый класс и выбираю Run ... Test.

Пожалуйста, помогите решить эту проблему, я понятия не имею, что не так.


person Community    schedule 15.02.2017    source источник
comment
Является ли provideActivity() настраиваемым методом? Можете ли вы предоставить его содержание?   -  person sebokopter    schedule 19.02.2017
comment
может быть дубликатом: stackoverflow.com/questions/40867407/ попробуйте определить файл multiDexKeepProguard ('../proguardRules/multidex-proguard.pro') в вашей конфигурации аромата, и в файле используйте синтаксис, подобный proguard, чтобы сохранить классы, которые вы не можете найти в своих тестах, multidex - это дьявол, чтобы получить правильно иногда в тестовых прогонах   -  person originx    schedule 03.03.2017
comment
APK-файлы Test Instrumentation до того, как Lollipop не смогут мультидексировать, даже если вы попытаетесь. WireMock имеет огромное количество методов, и я предполагаю, что ваш тестовый APK мультидексирован. Первый файл dex будет выбран, но все последующие файлы dex будут недоступны, и вы получите исключение ClassNotFoundException, если попытаетесь получить доступ к любому из классов в других файлах dex.   -  person Sam Edwards    schedule 13.03.2017
comment
Вы нашли решение?   -  person Day    schedule 12.07.2017


Ответы (1)


Вы можете попробовать более новую версию wiremock. позже 2.0.8-бета. подробнее об этом см. в этом ответе stackoverflow

person best wishes    schedule 22.01.2018