在AsyncTask中验证方法调用

时间:2014-07-08 03:38:37

标签: junit android-asynctask mocking mockito

我正在与Mockito一起运行Android Junit测试。我正在测试一个创建AsyncTask的活动,我想验证在AsyncTask中调用了一个方法,但是我收到了一个错误:

Wanted but not invoked

测试用例如下所示:

@Test
public void testFoo(){

// Mocks have been initialized

myActivity.onCreate(null);

verify(myMock).myMethod(params);
}

如果我像这样运行测试,我会收到错误

Wanted but not invoked

我收到错误的原因是因为在AsyncTask中调用了myMethod,但在调用verify(...)之前调用了myMethod

为了证明这是正确的,我在测试中暂停了一下这个

@Test
public void testFoo(){

// Mocks have been initialized

myActivity.onCreate(null);

thread.sleep(1000); // sleep so the AsyncTask can finish before calling verify

verify(myMock).myMethod(params);
}

并且测试通过了。

显然,我不想让线程真正入睡。如何在AsyncTask完成后正确确保调用验证?

1 个答案:

答案 0 :(得分:0)

尝试verification with timeout

verify(mock, timeout(1000)).myMethod(params);

您也可以仅使用executeOnExecutor在测试中运行同步执行程序,然后将一些以测试为中心的代码引入生产组件,并进一步测试您想要的实际实现。超时可能是让您尽可能接近的最简单方法。