2015-08-16 94 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