Jako praktyk TDD chcę przetestować wszystko, co koduję.Biblioteka do potwierdzania wielu kodów w języku Java
W ciągu ostatnich kilku lat koduję wiele kodów wielowątkowych i jedna część moich testów bardzo przeszkadza.
Kiedy muszę stwierdzić coś, co może się zdarzyć podczas pętli run() I skończyć z pewnym rodzajem o twierdzenie, jak ta:
assertEventually(timeout, assertion)
wiem, że Mockito ma rozwiązanie tego problemu, ale tylko dla wywołania weryfikuj. Wiem również, że JUnit ma właściwość timeout, która jest przydatna, aby uniknąć powieszenia (lub zawsze trwałych) testów. Ale to, czego chcę, to coś, co pozwala mi stwierdzić coś, co może stać się prawdą w czasie.
Moje pytanie brzmi, czy ktokolwiek wie, że biblioteka zapewnia taką możliwość?
Oto moje rozwiązanie do tej pory:
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);
}
Korzystanie kończy się tak:
assertEvetuallyTrue(1000, new Runnable() {
public void run() {
assertThat(Thread.activeCount()).isEqualTo(before);
}
});
Co stwierdzając w próbce kodu? nazwa metody implikuje stwierdzenie, że coś ma wartość true, ale kod wykonuje tylko Runnable i upewnia się, że nie powoduje błędu. – dkatzel
Zakładam, że użyjesz pewnego rodzaju asercji, aby sprawdzić swoje warunki. Więc rzucają znaczące wyjątki, które pomagają w debugowaniu kodu. Podam przykład. –
Spodziewałbym się, że assertEventually rzuci wyjątek, który wygasa. W twoim przykładzie wygląda na to, że próbuje podać wartość null. Ponadto, może być sens, aby rzucić 'AssertError'. – Gray