亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Mockito:輪詢等待驗證

Mockito:輪詢等待驗證

慕俠2389804 2023-02-16 17:01:29
@Mock WorkItem;@Test(timeOut = 300000)public void testSomething() throws Exception {    <do some testing>    verifyWorkDone()}public void verifyWorkDone() {    ArgumentCaptor<WorkItemQuery> captor =     ArgumentCaptor.forClass(WorkItemQuery.class);    verify(WorkItem, atLeastOnce()).call(captor.capture());}我想更改上面的代碼塊,verifyWorkDone()以便它不斷重試驗證,直到測試超時。有沒有好的方法可以做到這一點?只是拋出一個while循環?
查看完整描述

2 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

作為測試行為的一部分,測試異步行為通常不應涉及輪詢以檢查是否發生了某些事情。我建議隔離將異步運行的組件并“正?!眴为殰y試它。然后,通過在響應前模擬異步組件一段固定的時間來測試將等待異步組件的組件。wait您可以使用它來測試所有相關情況下的等待組件:響應按預期出現、響應出現但它是一個錯誤、響應在超時之前從未出現等。


例如


public interface AsyncObject {

    public void invoke();

    public Object check();

}


public class MyMockAsyncObject implements AsyncObject {


    private long delay;

    private long startTimeMillis;


    public MyMockAsyncObject(long delay) {

        this.delay = delay;

    }


    public void invoke() {

        startTimeMillis = now();

    }


    public Object check() {

        if (now() - startTimeMillis > delay) {

            return new Object();

        } else {

            return null;

        }

    }

}


public class Waiter {


    public AsyncObject myAsyncObject;


    public Waiter(AsyncObject async) {

        this.myAsyncObject = async;

    }


    public Object getResult() {

        myAsyncObject.invoke();

        return this.waitForResult();

    }


    private Object waitForResult() {

        while(// is not timed out) {

            // wait a while

            myAsyncObject.check(); 

            // return result if it's there

        }

        throw new Exception();

    }

}


查看完整回答
反對 回復 2023-02-16
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

Mockito 有一個功能可以解決這個問題,稱為VerificationWithTimeout。我在我的代碼中使用它來驗證異步行為。這是 1000 毫秒超時時的樣子:

@Mock WorkItem;


@Test

public void testSomething() throws Exception {

    <do some testing>

    

    ArgumentCaptor<WorkItemQuery> captor = 

    ArgumentCaptor.forClass(WorkItemQuery.class);

    verify(WorkItem, timeout(1000)

      .atLeastOnce()).call(captor.capture);

}


查看完整回答
反對 回復 2023-02-16
  • 2 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號