Mam następujący kod, który spodziewałem się pomyślnie zakończyć, ale kod kończy się niepowodzeniem w wierszu "fail (" nie powinno być osiągnięte ");". Czy ktoś mógłby wyjaśnić, dlaczego domyślny handler przechwycony wyjątek nie nazywa się:Jak korzystać z przechwyconego podręcznika obsługi wyjątków dla testu wielowątkowego w junit?
public class UncaughtExceptionTest extends TestCase
implements UncaughtExceptionHandler {
private final List<Throwable> uncaughtExceptions =
new CopyOnWriteArrayList<Throwable>();
class UncaughtExceptionTestInnerClass implements Runnable {
private final ScheduledThreadPoolExecutor executor =
new ScheduledThreadPoolExecutor(1);
private final CountDownLatch latch;
UncaughtExceptionTestInnerClass(CountDownLatch latch) {
this.latch = latch;
executor.schedule(this, 50, TimeUnit.MILLISECONDS);
}
@Override
public void run() {
System.out.println("This is printed");
fail("this should fail");
latch.countDown();
}
}
@Test
public void testUncaughtExceptions() {
Thread.setDefaultUncaughtExceptionHandler(this);
CountDownLatch latch = new CountDownLatch(1);
UncaughtExceptionTestInnerClass testTheInnerClass =
new UncaughtExceptionTestInnerClass(latch);
try {
if (!latch.await(1, TimeUnit.SECONDS)) {
if (uncaughtExceptions.size() > 0) {
Throwable exception = uncaughtExceptions.get(0);
System.out.println("First uncaught exception: " +
exception.getMessage());
}
else {
fail("this should not be reached");
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void uncaughtException(Thread t, Throwable e) {
uncaughtExceptions.add(e);
}
}
Dlaczego jest 'fail (" to powinno zawieść ");' linia tam? Czy to jest zamierzone? W ten sposób zatrzask nigdy nie odlicza. – BalusC
@BalusC: tak, to jest zamierzone. Aby poprawnie przejść test, metoda latch.await() powinna przerwać, powodując, że zwróci false. Kod powinien następnie wydrukować komunikat z nieprzechwyconego wyjątku AssertionFailedError, który został zgłoszony w kwestionowanej linii. –