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();
}
}

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);
}
添加回答
舉報