J'ai le code suivant que je m'attends à terminer avec succès mais le code échoue à la ligne "fail (" cela ne devrait pas être atteint ");". Quelqu'un peut-il s'il vous plaît expliquer pourquoi le défaut gestionnaire d'exceptions est uncaught pas appelé:Comment utiliser un gestionnaire d'exception non intercepté pour un test multi-thread dans 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);
}
}
Pourquoi le 'fail (" ceci devrait échouer ");' line there? Est-ce intentionnel? De cette façon, le verrou ne décompte jamais. – BalusC
@BalusC: oui, c'est intentionnel. Pour réussir le test, la méthode latch.await() doit expirer, provoquant le retour de false. Le code doit ensuite imprimer le message de l'exception uncaught de AssertionFailedError qui a été jeté sur la ligne que vous remettez en question. –