Mockito模拟回调接口

时间:2018-11-24 15:35:54

标签: mockito

我使用方法post提供了非常基本的服务,该方法通过回调接口更新进度。

public class HttpPostService {
    public interface UploadingProgressListener {
        void onProgress(int progress);
    }

    public int post(InputStream body, UploadingProgressListener listener)
    {
         // shortened for brevity
         // read inputstream and writes bytes to HttpURLConnection outputstream
         // read inputstream in loop notify listener about progress
         listener.onProgress(percentage);
    }
}

我想用Mockito测试该类,基本上模拟UploadingProgressListener,然后检查是否使用正确的百分比参数对其进行了n次调用。

@Test
public void testPostFileProgressListener() throws IOException {
    UploadingProgressListener mockListener = mock(UploadingProgressListener.class);

    InputStream inputStream = new ByteArrayInputStream();
    service.postFile(inputStream, mockListener);
    verify(mockListener, times(5)).onProgress(100);
}

但是,当我运行测试时,它说它只被调用一次,但是当我调试它时,监听器被调用了5次。

我知道这里有Answers和ArgumentCaptors的概念,但是我认为至少算出模拟被调用的次数是正确的。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您确实要检查是否有5个调用的有序序列,并以20、40、60、80和100作为参数,则只需要

    InOrder inOrder = inOrder(mockListener);
    inOrder.verify(mockListener).onProgress(20);
    inOrder.verify(mockListener).onProgress(40);
    inOrder.verify(mockListener).onProgress(60);
    inOrder.verify(mockListener).onProgress(80);
    inOrder.verify(mockListener).onProgress(100);

如果您只想检查监听器已被调用5次,而不关心参数,则只需使用

    verify(mockListener, times(5)).onProgress(anyInt());