如何使用Espresso JMockit
作者:互联网
但我不进行测试.
如果你有解决方法,请帮助我.
我写了一些文件(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依赖项,然后重新编译它并以这种方式将其添加到项目中.
这显示了错误的依赖:
您可以看到Runner类是如何粘贴到项目中的.
修复JMockit依赖项后,需要按如下方式添加JMockit:
androidTestCompile ('org.jmockit:jmockit:1.18') {
exclude group: 'junit'
}
标签:java,android,android-espresso,jmockit 来源: https://codeday.me/bug/20190706/1399249.html