2016-08-22 93 views
1

我想在android中爲異步方法執行單元測試。結果需要是「通過觀察員的回調通知」。看看下面的例子。我如何爲doSomething()方法編寫單元測試用例?如何做異步調用的單元測試?

public interface IFooObserver { 
    void onResult(String result); 
} 

public class Foo { 

    private IFooObserver mObserver; 

    public Foo(IFooObserver observer) { 
     mObserver = observer; 
    } 

    public void doSomething() { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // do something.. 
       mObserver.onResult("hello, world!"); 
      } 
     }).start(); 
    } 
} 
+1

可能的重複http://stackoverflow.com/questions/2321829/android-asynctask-testing-with-android-test-framework –

回答

0

簡單地說:不要使用「裸機」線程。

改爲使用ExecutorServices - 因爲它允許您使用依賴注入將多線程代碼轉換爲單線程代碼進行測試 - 使用Same Thread Executor Service

例子:

class Whatever { 
    private final ExecutorService service; 
    Whatever() { this (Executors.newSingleThreadExecutor()); } 

    Whatever(ExecutorService service) { this.service = service; } 

    void foo() { 
    service.submit (... whatever 

的一點是:當您直接使用一個線程,你有沒有控制任何在那裏。最有可能的是,這將導致需要複雜信號的測試用例,或者更糟糕的情況:依靠在這裏或那裏調用sleep()。這總是很糟糕 - 它增加了測試的執行時間;或者,更糟糕的是,你會得到錯誤的時機; 偶爾你的測試在迴歸期間失敗。由於測試系統的負載不同,和顯示不同運行時特性的線程。因此,長話短說:如果可能,避免直接使用線程;而是使用前述的概念來簡單地避免多個線程進行測試。