2015-11-05 18 views
1

我正在使用ApplicationTestCase測試一個Android應用程序。我想模仿我AsyncTasks(例如簡化爲說明問題)中的一個:爲什麼不使用AsyncTask進行模擬?

public class Foo extends AsyncTask<Void,Void,Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 
    return null; 
    } 
} 

因此,要建立我的測試,我做了以下內容:

private Foo mockFoo; 

@Override 
protected void setUp() throws Exception { 
    super.setUp() 

    mockFoo = mock(Foo.class); 

    createApplication(); 
} 

然後實際測試是以下:

public void testAsyncTaskMock() { 
    mockFoo.execute(); 
    verify(mockFoo).execute(); 
} 

,但我得到一個異常時,mockFoo.execute();運行:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.AsyncTask$Status.ordinal()' on a null object reference 

爲什麼嘲笑AsyncTask不起作用的技術?

請注意,刪除createApplication();會導致此問題在此簡單情況下消失,但對於我的實際測試,我確實需要創建應用程序。

回答

5

AsyncTask.execute是最後的,並且Mockito can't mock final classes or methods

  • 無法模擬最終方法 - 它們的實際行爲沒有任何例外地執行。 Mockito無法警告你嘲笑最後的方法,所以要提高警惕。

具體地說,這是因爲Java可以解決在編譯時鏈接的,這意味着可以的Mockito不能使用其產生的子類和方法重寫來改變行爲。

您可以選擇使用Powermock,它使用一種特殊的類加載器重寫舊的行爲,或Robolectric,它不相同,但替換Android的特定測試友好的替代實現類(「影」)including one for AsyncTask

+0

Robolectric + 1!我喜歡它的理念 - 爲什麼要測試交互?改爲測試效果。 – ZhongYu

相關問題