簡體   English   中英

如何從不使用Mockito模擬對象來測試異步方法?

[英]How to test async method from not mocking object with Mockito?

我想用Mockito測試以下代碼

@Override
public void getSessionList(final int carId, final ResultCallback<List<Session>> callback) {
    jobExecutor.execute(new Runnable() {
        @Override
        public void run() {
            List<SessionEntity> sessions = IDataStore.getSessionList(carId);
            final List<Session> sessionList = new ArrayList<>();
            if (sessions != null) {
                for (SessionEntity entity : sessions) {
                    sessionList.add(mapper.transform(entity));
                }
                uiThread.post(new Runnable() {
                    @Override
                    public void run() {
                        if (callback != null) {
                            callback.onResult(sessionList);
                        }
                    }
                });
            } 
        }
    });
}

我試圖做這樣的事情,但是我的驗證方法將比可運行的早執行。 Thread.sleep()對於前兩個驗證工作得很好,但是如何測試將在主線程中執行的callback.onResult的結果?

private Repository repository // not mocked
@Mock
private IDataStore dataStore;
@Mock
private DataToDomainMapper dataToDomainMapper;
@Mock
private ResultCallback resultCallback;

@Test
public void testGetSessionListCallbackSuccess(){
    List<SessionEntity> sessionEntities = Arrays.asList(sessionEntity, sessionEntity, sessionEntity);

    given(dataStore.getSessionList(anyInt())).willReturn(sessionEntities);
    given(dataToDomainMapper.transform(any(SessionEntity.class))).willReturn(session);

    repository.getSessionList(1, resultCallback);

    verify(dataStore).getSessionList(anyInt());
    verify(dataToDomainMapper, times(3)).transform(any(SessionEntity.class));
    verify(resultCallback).onResult(any(List.class));
}

檢出用於測試異步方法的工具Awaitility 非常方便的工具,為我節省了大量測試異步方法的時間。

我相信您可以將匿名Runnable移至內部(或嵌套)類並在兩部分進行拆分測試:檢查jobExecutor是否開始使用相應的類實例執行;以及檢查內部/嵌套類的run()方法是否按預期工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM