簡體   English   中英

為什么模擬不能與AsyncTask一起使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM