我正在用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
我得到错误的原因是因为myMethod
在AsyncTask中被调用,但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
完成后调用验证?
尝试超时验证。
verify(mock, timeout(1000)).myMethod(params);
您也可以在测试中只使用executeOnExecutor
在同步执行器上运行,但是随后您将一些以测试为中心的代码引入到您的生产组件中,并且进一步偏离了测试您想要的实际实现。超时可能是让您尽可能接近所需的最简单方法。