Android测试不会在低于5的设备(API 21)NoClassDefFoundError上运行

时间:2017-02-15 11:04:02

标签: java android junit android-testing wiremock

我正在尝试为我的项目运行Instrumental测试。但是他们不会在版本低于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) 

我已经尝试过针对类似问题的所有解决方案。

这是我的项目结构的样子。

project structure

测试的gradle依赖

  /************* 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 examples上,同样的错误。

也许我错误地运行测试,我只需点击测试类并选择Run ... Test

请帮助解决这个问题,我不知道出了什么问题。

1 个答案:

答案 0 :(得分:1)

您可以尝试更新版本的wiremock。晚于2.0.8-beta。 有关这方面的更多信息,请查看此stackoverflow answer