用户Mockito在我的案例

时间:2015-11-08 12:19:20

标签: android unit-testing junit mockito

在我的 Android 项目中,我有一个类HandlerThread

public class MyHandlerThread extends HandlerThreads {
   private Handler mHandler;
   …
   public void doAsyncTask(MyAsyncTask task) {
        mHandler = new Handler(this.getLooper());
        mHandler.post(task);
    }
}

上述函数的参数类型MyAsyncTask是类扩展Runnable

public abstract class MyAsyncTask implements Runnable {
    @Override
    public void run() {
        doTask();
    }

    public abstract void doTask();
}

我有一个MyWorker类,其函数使用MyHandlerThread class:

public class MyWorker {

  public void work() {
      MyHandlerThread handlerThread = new MyHandlerThread();
      handlerThread.start();
      handlerThread.doAsyncTask(new MyAsyncTask() {
           @Override
           doTask() {
               int responseCode = sendDataToServer();
           }
      });
  }
}

我想使用Mockitowork()类中的MyWorker函数进行单元测试(例如,检查服务器responseCode)。如何在Mockito中做到这一点?

1 个答案:

答案 0 :(得分:0)

你想测试什么? MyWorkerMyHandlerThread?匿名的MyAsyncTask?一切都好吗?可能是一个坏主意,特别是如果匿名MyAsyncTask依赖于实际的服务器响应(这会阻止它成为一个好的单元测试,因为您正在测试整个系统)。所以,我会将整个部分分成几部分并单独测试所有这些部分。如果您已经这样做了,那么您可以使用集成测试对一个真实服务器检查多个部分。

要测试MyHandlerThread,您可以举例说明一个HandlerFactory,模拟它,从而确保正确调用处理程序。

public class MyHandlerThread extends HandlerThreads {
   private HandlerFactory handlerFactory; // <- Add setter
   …
   public void doAsyncTask(MyAsyncTask task) {
        Handler mHandler = handlerFactory.createHandler(this.getLooper());
        mHandler.post(task);
    }
}

易于测试的装置。 MyAsyncTask简短而抽象,老实说,我不会对此进行测试。没有多少收获,因为它实际上做不了多少。和MyWorker?取决于,但你可以,例如,为MyHandlerThread添加一个getter / setter,允许你模拟它。将您的匿名类提取为真正的类可能会允许您测试那个,独立于其他类。