[英]Why doesn't mocking work with AsyncTask?
我正在使用ApplicationTestCase測試一個Android應用程序。 我想模擬我的AsyncTasks之一(示例簡化以顯示問題):
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();
時出現異常mockFoo.execute();
運行:
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.AsyncTask$Status.ordinal()' on a null object reference
為什么模擬AsyncTask的技術不起作用?
請注意,刪除createApplication();
導致問題在這種簡單情況下消失,但是對於我的實際測試,我確實需要創建該應用程序。
AsyncTask.execute是final, Mockito無法模擬final類或方法 。
- 無法模擬最終方法-執行它們的實際行為沒有任何異常。 Mockito無法警告您嘲笑最終方法,因此請保持警惕。
具體來說,這是因為Java可以在編譯時解析鏈接,這意味着Mockito不能使用其生成的子類和方法重寫來更改行為。
您可以選擇使用Powermock (使用特殊的類加載器來重寫舊行為),或者選擇Robolectric ,使用相同的功能,但將類替換為特定於Android的測試友好的替代實現(“影子”), 包括AsyncTask的替代實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.