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

5 java junit android 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) 
Run Code Online (Sandbox Code Playgroud)

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

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

项目结构

并且测试的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'
Run Code Online (Sandbox Code Playgroud)

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();

}
Run Code Online (Sandbox Code Playgroud)

这不仅发生在我的项目中,而且还发生了Wiremock示例,同样的错误.

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

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

bes*_*hes 1

您可以尝试更新版本的wiremock。晚于 2.0.8-beta。有关此内容的更多信息,请查看此stackoverflow 答案