为什么模拟不能与AsyncTask一起使用?

问题描述:

我正在使用ApplicationTestCase测试一个Android应用程序.我想模拟我的一个AsyncTasks(简化示例以显示问题):

I'm testing an Android app using an ApplicationTestCase. I want to mock one of my AsyncTasks (example simplified to show the problem):

public class Foo extends AsyncTask<Void,Void,Void> {
  @Override
  protected Void doInBackground(Void... unused) {
    return null;
  }
}

所以要设置我的测试,我做了以下事情:

So to set up my tests, I did the following:

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();运行时出现异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.AsyncTask$Status.ordinal()' on a null object reference

为什么模拟AsyncTask的技术不起作用?

请注意,删除createApplication();会使问题在这种简单情况下消失,但是对于我的实际测试,我确实需要创建该应用程序.

Note that removing createApplication(); causes the problem to go away in this simple case, but for my actual testing I do need the application to be created.