Tengo el siguiente código que espero que se ejecute correctamente hasta la finalización, pero el código falla en la línea "error (" no se debe alcanzar ");". Por favor alguien puede explicar por qué la excepción no capturada por defecto no se llama:¿Cómo utilizar un controlador de excepciones no detectadas para una prueba de múltiples hilos en 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);
}
}
¿Por qué falla la línea 'fail (" this should fail ");'? Es esto intencional? De esta forma, el pestillo nunca cuenta hacia abajo. – BalusC
@BalusC: sí, esto es intencional. Para pasar la prueba correctamente, el método latch.await() debe expirar, haciendo que devuelva falso. El código debería imprimir el mensaje de la excepción AssertionFailedError no detectada que se lanzó en la línea que está cuestionando. –