Как практикующий TDD, я хочу проверить все, что я кодирую.Библиотека для утверждения многопоточного кода на Java
В течение последних нескольких лет я кодировал многопотоковый код, и одна часть моих тестов очень беспокоила.
Когда я должен утверждать то, что может произойти во время цикла запуска() я в конечном итоге с какой-то вид O утверждение, как это:
assertEventually(timeout, assertion)
Я знаю, что Mockito имеет решение для этого, но только для проверить звонок. Я также знаю, что JUnit имеет свойство тайм-аута, которое полезно, чтобы избежать вешающих (или когда-либо длительных) тестов. Но то, что я хочу, - это то, что позволяет мне утверждать то, что со временем может стать истинным.
Так что мой вопрос: кто-нибудь знает библиотеку, которая предоставляет это?
Вот мое решение до сих пор:
private void assertEventually(int timeoutInMilliseconds, Runnable assertion){
long begin = System.currentTimeMillis();
long now = begin;
Throwable lastException = null;
do{
try{
assertion.run();
return;
}catch(RuntimeException e){
lastException = e;
}catch(AssertionError e){
lastException = e;
}
now = System.currentTimeMillis();
}while((now - begin) < timeoutInMilliseconds);
throw new RuntimeException(lastException);
}
Используя это заканчивается так:
assertEvetuallyTrue(1000, new Runnable() {
public void run() {
assertThat(Thread.activeCount()).isEqualTo(before);
}
});
Что вы утверждающего в образце кода? имя метода подразумевает утверждение, что что-то имеет значение true, но код выполняет только Runnable и гарантирует, что он не выйдет из строя. – dkatzel
Я предполагаю, что вы будете использовать какое-то утверждение для проверки своих условий. Таким образом, они будут бросать значимые исключения, которые помогают отлаживать ваш код. Я приведу пример. –
Я бы ожидал, что assertEventually выйдет за исключение, которое он истечет. В вашем примере похоже, что он пытается сбросить нуль. Кроме того, имеет смысл бросить «AssertError». – Gray