2015-11-19 102 views
2

懲戒在我班上一個方法測試過程中,我嘗試使用JUnit和對的Mockito寫單元測試(儀器)爲Android。使用的Mockito

一些背景:我正在測試一個嚴重依賴視圖的類,我不能/不想在測試過程中實際膨脹視圖。有一次,我的類測試想要使用視圖的寬度,並且我定義了一個(公共)方法,該類用於在運行時獲取寬度(getWidth())。

在我的測試中,我想用Mockito來模擬getWidth()方法。 (同時讓其他同學表現得相同)。只是爲了澄清:我的班級中的一種方法呼籲getWidth(),我希望它在測試過程中返回一個模擬值。

所以我嘗試使用Mockito.spy()方法實例化類,但我不知道這是否是正確的方法(它不起作用),或者如果有其他事情我應該做。

我當前的代碼:

mGraph = Mockito.spy(new Graph(xAxis, leftAxis, null, false, new Graph.Style(), curve)); 
Mockito.when(graph.getGraphWidth()).thenReturn(400); 

我收到以下錯誤消息,雖然我不知道這是否是相關的,或只是另一個錯誤:

java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)

回答

5

我從這個

testCompile ('junit:junit:4.12', 
      'com.google.dexmaker:dexmaker-mockito:1.0', 
      'com.google.dexmaker:dexmaker:1.0') 

改變我的build.gradle這個

testCompile ('junit:junit:4.12', 
      'org.mockito:mockito-core:1.9.5') 

解決了這個問題,我想,這可能是因爲DEX-的依賴,才應使用與androidTestCompile-標籤。

3

你的間諜語法是正確的,但是你有兩個危險:

  1. 您可能還需要一些手動配置爲Adil Hussain張貼在this SO answer

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

    Mockito.when(graph.getGraphWidth()).thenReturn(400); 
    

    ...包含了一個電話:

       graph.getGraphWidth() 
    

    那會的Mockito按捻之前調用。這對這個調用來說可能很好,但在真正的方法調用會拋出異常的情況下,Mockito.when語法沒有幫助。相反,使用doReturn

    Mockito.doReturn(400).when(graph).getWidth(); 
    

    注意,調用when只解決了圖形,而不是整個方法調用,它允許的Mockito禁用所有行爲(包括調用真正的方法),並只使用方法調用確定方法。

+0

感謝您的意見,這肯定會有問題!但是,我在(1)中手動配置的問題是我*不運行儀器測試 - 而且我不想。所以我不能使用該儀器。 – Joakim

+1

哦!在這種情況下,問題更加明顯:您不能在基於JVM的測試中使用dexmaker。確保它不在類路徑上,並且你的版本的正常依賴關係在它上面。 –

+0

是的,我意識到這一點,並添加爲答案...但它沒有任何聲明......感謝您的幫助 – Joakim