其他分享
首页 > 其他分享> > 如何使用Espresso JMockit

如何使用Espresso JMockit

作者:互联网

我想使用EspressoJMockito.

但我不进行测试.
如果你有解决方法,请帮助我.

我写了一些文件(build.gradle(app,project),Test java)如下.

的build.gradle(APP)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "burning.tutorial"
        minSdkVersion 21
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE'
    }

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // App's dependencies, including test
    compile 'com.android.support:support-annotations:22.2.0'

    // JMockit
    androidTestCompile 'org.jmockit:jmockit:1.18'

    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
    androidTestCompile 'com.android.support.test:runner:0.3'

}

的build.gradle(项目)

projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

MainActivityTest.java

import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void sampleTest() throws Exception {
        onView(withId(R.id.age)).check(matches(ViewMatchers.isDisplayed()));
    }
}

此测试运行时,发生如下错误.

:app:preDexDebugAndroidTest UP-TO-DATE
:app:dexDebugAndroidTest
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/junit/runner/Runner;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
    at com.android.dx.command.dexer.Main.run(Main.java:246)
    at com.android.dx.command.dexer.Main.main(Main.java:215)
    at com.android.dx.command.Main.main(Main.java:106)
Error:Execution failed for task ':app:dexDebugAndroidTest'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED

解决方法:

简短回答:

你不能轻易解决这个问题,因为JMockit有一个错误的JUnit依赖.要修复它,您需要先修复JMockit.

答案很长:

您的应用包含org.junit.runner.Runner两次:

>通过JMockit,因为它包含库中的Runner类文件(这很糟糕,因为它只包含Runner类而不是整个库).
>通过com.android.support.test:runner,因为它的一个依赖项是junit库(这是添加JUnit支持的正确方法).

正常修复是排除以下之一:

>排除JMockit的JUnit依赖项:
这不起作用,因为JUnit未定义为正确的依赖项. JUnit只是粘贴在自己项目中的类文件中.这是一件坏事.
>为com.android.support.test排除JUnit依赖项:runner:
我们可以做到这一点,但是这将删除JMockit没有放入项目的junit库中的所有其他类.这将有效地破坏您使用的任何其他junit代码.

如果您真的需要使用JMockit,那么您可以考虑编辑项目,使其正确包含junit依赖项,然后重新编译它并以这种方式将其添加到项目中.

这显示了错误的依赖:

Android Studio screenshot

您可以看到Runner类是如何粘贴到项目中的.

修复JMockit依赖项后,需要按如下方式添加JMockit:

androidTestCompile ('org.jmockit:jmockit:1.18') {
    exclude group: 'junit'
}

标签:java,android,android-espresso,jmockit
来源: https://codeday.me/bug/20190706/1399249.html