Mockito: опрос ждать на проверку - PullRequest
0 голосов
/ 25 июня 2019
@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(), чтобы он продолжал повторять попытки проверки до истечения времени ожидания теста.

Есть ли хороший способ сделать это? просто бросить цикл времени?

1 Ответ

1 голос
/ 25 июня 2019

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