2012-09-04 113 views
36

我想在我的Android項目中使用Mockito。 我發現很好的教程,處理它:http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/Android上的Mockito + Dexmaker

它基本上使用新版本的Mockito + Dexmaker和一切按預期工作。
然而,當我試圖嘲弄一些Android的特定對象即:

Context context = mock(Context.class); 

我收到此異常:

java.lang.IllegalArgumentException: 
    dexcache == null (and no default could be found; 
    consider setting the 'dexmaker.dexcache' system property) 
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359) 
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252) 
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54) 
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26) 

不知道如何解決它?

+0

如果你不使用gradle這個看到http://stackoverflow.com/questions/29290795/attempt-to-mockito-mock-any-class-generates-exceptionininitializererror/41350001#我的回答您建立的APK 41350001瞭解更多信息 –

回答

33

創建從@ MrChaz的答案,這個@ rjath的評論對我更好:

System.setProperty(
    "dexmaker.dexcache", 
    getInstrumentation().getTargetContext().getCacheDir().getPath()); 

我把它放在我的setUp()方法中。

10

我已經設法拼湊出一個似乎對我有用的修復程序。 對於清單,我添加了讀寫外部存儲。 爲了測試,我在測試中添加了System.setProperty("dexmaker.dexcache", "/sdcard");。 我添加了一個SD卡的模擬器圖像。

我相信這個工程,因爲在默認情況下的Mockito嘗試使用應用程序的緩存目錄,但我從來沒有運行的活動,所以我懷疑的目錄從不被OS

+3

您也可以撥打以下電話 - http://code.google.com/p/dexmaker/issues/detail?id=2 ...'getInstrumentation()。getTargetContext()。getCacheDir( );」 – rajath

8

所以問題在於Dexmaker無法在Android> = 4.3上找到其他人提到的緩存路徑,如this dexmaker issue中所述。

我又可以在每個測試執行在一個自定義儀器測試運行的解決辦法,而不是(或他們的超)setUp(),因爲感覺有點少哈克(它真的是隻有一個地方 - 在每個子類中不繼承)更靈活。 有關文檔起見,這些都是必要的改變,以做到這一點:

public class CustomInstrumentationTestRunner extends InstrumentationTestRunner { 

    @Override public void onCreate (final Bundle arguments) { 
     super.onCreate(arguments); 

     // temporary workaround for an incompatibility in current dexmaker (1.1) implementation and Android >= 4.3 
     // cf. https://code.google.com/p/dexmaker/issues/detail?id=2 for details 
     System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString()); 
    } 
} 

並設置項目(或測試項目),螞蟻構建時使用這個類的儀器測試運行在其AndroidManifest.xml

<instrumentation 
    android:name="my.package.CustomInstrumentationTestRunner" 
    android:targetPackage="my.target.package" /> 

或其build.gradle與gradle這個建築時:

android { 
    defaultConfig { 
     // ... 
     testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner' 
    } 
    // ... 
} 

如果您有其他instrumentation項,您可以在它們之間切換on the command line或在IDE運行配置中選擇一項。

3

我對Android Library項目有這個問題,但不適用於應用程序項目!如上所述設置系統屬性「dexmaker.dexcache」解決了這個問題。 我運行的是Android 4.3的Nexus 4設備,具有19.0.3工具,目標跟蹤API 19, 我的依賴關係建設:

androidTestCompile "org.mockito:mockito-core:1.9.5" 
androidTestCompile "com.google.dexmaker:dexmaker:1.0" 
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.0" 
+0

我剛剛意識到我遇到過你提到的同樣的事情(圖書館遇到問題,但不是應用程序),我只是不知道當時爲什麼會發生這種情況。 –

3

它看起來像dexmaker項目已經從Google CodeGitHub

the maven central repository有刊登在2014年3月和2014年12月

1.1版本和1.2我已經驗證了這一點「dexcache == NULL」的問題仍然通過1.2版本存在 - 但僅限於某些設備。例如,Android 5.0的Galaxy S5有問題,而Android 4.4.2的Galaxy S4沒有。

我克隆了GitHub存儲庫(last commit March 12th 2015 - ca74669),並在本地運行,並且問題已修復(歷史記錄中還提交了支持此問題的提交)。所以一旦1.3版本發佈,希望這個問題沒有好轉!

任何人想運行1.3快照的本地副本,這裏就是我這樣做(在Mac上,但其他的平臺應太,你需要MVNADBDXPATH):

  1. git clonehttps://github.com/crittercism/dexmaker.git
  2. cd dexmaker
  3. 使用Maven構建,如果你使用eclipse /螞蟻

androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'

  • 或者pom.xml如果,或覆蓋您的libs/dexmaker.jar~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar:10
  • cp -R ~/.m2/repository/com/google/dexmaker $ANDROID_HOME/extras/android/m2repository/com/google
  • 然後在app/build.gradle更改版本此外,FYI,original issue report也適用於Google Code上的相同問題。

2

您可以將mockito核心添加爲依賴項。然後,這個錯誤不會發生,你不需要一個解決方法。

dependencies { 
    ... 
    testCompile 'org.mockito:mockito-core:1.10.19' 
} 
相關問題