2015-08-16 89 views
4

我想使用EspressoJMockito如何使用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 

回答

1

简短的回答:

你不能轻易解决这个问题,因为JMockit有故障JUnit依赖。要修复它,您需要先修复JMockit

龙答:

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

  • 通过JMockit,因为它包括在库中的亚军类文件(这是不好的,因为它仅包括亚军类,而不是整个图书馆)。
  • 通过com.android.support.test:runner,因为它的一个依赖是junit库(这是添加JUnit支持有道

一个正常的解决将是排除以下之一:

  • 排除JUnit依赖关系JMockit: 这不起作用,因为JUnit未被定义为适当的依赖关系。JUnit仅粘贴到类文件中的自己的项目中。这是一件坏事 去做。
  • 排除JUnitcom.android.support.test:runner的依赖关系: 我们可以这样做,但这会从junit库中删除JMockit没有放入其项目的所有其他类。这将有效地打破您使用的任何其他junit代码。

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

这表明发生故障的依赖:

Android Studio screenshot

你可以看到如何Runner类只是粘贴到该项目。

固定JMockit依赖后,你需要添加JMockit如下:

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

的'org.junit.runner.Runner'列入JMockit其实就是原来的_modified_版本。它包含以下额外的代码:'static {Startup.initializeIfPossible(); }',我想你应该在完成这个修改之后调用你自己。我还没有检查'sun.tools.attach'包中的交易是什么,但我想它是类似的。 – Punksmurf