Вы можете перезаписать значение по умолчанию UncaughtExceptionHandler
для потоков. Он вызывается всякий раз, когда поток генерирует исключение. В этом обработчике вы можете проверить, равно ли ожидаемое исключение выданному исключению и, например, проверить сообщения или сосчитать случаи исключения. Используя CountDownLatch
, вы также можете проверить, генерируются ли исключения вовремя и сколько из них вы ожидаете.
Это работает, даже если у вас нет доступа к Thread
, созданному тестируемым классом. Если у вас есть доступ к нему, конечно, есть более простой подход, например, рефакторинг тестируемого класса и введение прослушивателя исключений или тому подобного. Сделайте тестируемый класс лучше, а также улучшите дизайн, например, удалив зависимость от Threads и непосредственно протестировав тело метода run (), который вы могли бы вывести за пределы.
public class ThreadExceptionTest {
private void foo() {
new Thread(new Runnable() {
@Override
public void run() {
throw new RuntimeException("exception messages");
}
}).start();
}
@Test
public void testFoo() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final RuntimeException expectedException = new RuntimeException("exception messages");
UncaughtExceptionHandler eh = new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
if (e.getMessage().equals(expectedException.getMessage()))
latch.countDown();
}
};
Thread.setDefaultUncaughtExceptionHandler(eh);
foo();
assertTrue(latch.await(100,TimeUnit.MILLISECONDS));
}
}