2015-06-07 45 views
1

我正在盡我所能來學習如何正確測試我的Android應用程序。現在我通常用以下結構:改進測試,回調?

  • 型號
  • 改造(讓它通過回調處理線程)
  • 包裝的改裝要求,關於成功和失敗 發佈事件由主持人被拾起。
  • 演示者。
  • 意見。

我已經在自己處理線程之前測試了應用程序。在這種情況下,我不知道如何驗證我的包裝是否實際調用事件發佈方法,因爲這些方法是在回調函數上調用的。我能做些什麼來解決這個問題?

我能想出的唯一解決方案是不使用回調,但它們很方便。僅僅爲了測試而自己處理事情不是退步嗎?

我只能猜測我的架構設計方法對於測試很差。

編輯:這個問題表明,它的測試拆分爲一個好主意:

1 .-測試您的異步過程正常提交。您可以模擬接受異步請求的對象,並確保提交的作業具有正確的屬性等。 2.-測試您的異步回調是否正確。在這裏,您可以嘲笑最初提交的作業,並假設它已正確初始化並確認您的回調是正確的。

但是,如何測試第一部分而不嘲笑改造服務(因爲不應該模擬第三方代碼)?

+0

你可能想看看Observables with Retrofit,它們也很方便,而且測試起來也容易很多。 – Egor

回答

1

嘗試使用Rx進行改造。它使同步Rx請求成爲異步,從而避免了回調的需要。更重要的是,您可以從Rx機制中獲得完美的回調,這將有助於您正確測試。

考查RxJava with Retrofit

+0

雖然使用RxJava時繼續使用事件總線會不好嗎? – Eddnav

+0

從你的問題我收集你正在使用事件總線發佈成功和失敗事件。由於Rx已經爲您提供完成回調,新數據點或錯誤發生,我建議您使用這些回調代替事件總線。 – prats110892

+0

這並不能解釋如何爲改造Observables編寫單元測試。 –

1

改造異步回調可以通過創建與同步執行程序的適配器進行測試。

在適配器工廠中,我使用下面的方法創建一個Retrofit適配器,用於使用Robolectric和WireMock進行測試。 WireMock充當baseURL上的服務器,並通過Retrofit爲REST API上的請求返回響應。

public static RestAdapter synchronousAdapter(Context context, String baseUrl) { 
    RestAdapter.Builder builder = initiateBuilder(context); 
    builder.setEndpoint(baseUrl); 
    Executor synchronous = new SynchronousExecutor(); 
    builder.setExecutors(synchronous, synchronous); 
    return builder.build(); 
} 

private static final class SynchronousExecutor implements Executor { 
    @Override public void execute(Runnable r) { 
     r.run(); 
    } 
}