В приведенном ниже примере кода, если testMethod() запущен через main(), он работает так, как ожидалось, но если он запущен через JUNIT, то MyUncaughtExceptionHandler не будет вызван.Java Thread.currentThread(). SetUncaughtExceptionHandler() не работает с JUNIT?
Есть ли какое-то объяснение для этого?
package nz.co.test;
import java.lang.Thread.UncaughtExceptionHandler;
import org.junit.Test;
public class ThreadDemo {
private void testMethod() {
Thread.currentThread().setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
Object b = null;
// Cause a NPE
b.hashCode();
}
@Test
public void testJunit() {
// Run via JUnit and MyUncaughtExceptionHandler doesn't catch the Exception
testMethod();
}
public static void main(String[] args) {
// Run via main() works as expected
new ThreadDemo().testMethod();
}
static class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("I caught the exception");
}
}
}
Что странно способ вызвать NPE, почему не просто 'певд NullPointerException()'? – kan
throw new NullPointerException() сделает байт-код в testMethod() немного другим. Настоящий код, который я искал для тестирования, использует усовершенствование байт-кода, и это имеет значение в этом случае. Если бы у меня это получилось, как ожидалось в junit, я бы затем улучшил testMethod(). –
дайте более подробную информацию, я думаю, мы могли бы найти лучший подход. Возможно, вам нужно создать новый поток, загрузчик классов или даже экземпляр JVM в тесте, но это будет интеграционный тест, а не единичный тест. – kan