Тестирование асинхронного поведения обычно не должно включать опрос, чтобы убедиться, что что-то произошло как часть тестового поведения.Я предлагаю изолировать компонент, который будет работать асинхронно, и тестировать его отдельно, «нормально».Затем протестируйте компонент, который будет ждать в асинхронном компоненте, перед тем, как ответить на запрос, а затем смоделировать асинхронный компонент на 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();
}
}