如何对异步调用进行单元测试?

时间:2016-08-22 06:33:42

标签: java android unit-testing

我想在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 个答案:

答案 0 :(得分: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()。这总是很糟糕 - 它会增加测试的执行时间;或者更糟糕的是,你得到错误的时机;并且偶尔您的测试在回归期间失败。由于测试系统的负载不同;和线程显示不同的运行时特征。

所以,长话短说:如果可能的话,避免直接使用线程;而是使用上述概念来简单地避免多个线程进行测试。