W poniższym przykładowym kodzie, jeśli metoda testMethod() jest uruchamiana przez funkcję main(), działa ona zgodnie z oczekiwaniami, ale jeśli jest uruchamiana przez JUNIT, wówczas wywołanie MyUncaughtExceptionHandler nie jest wywoływane.Java Thread.currentThread(). SetUncaughtExceptionHandler() nie działa z JUNIT?
Czy jest jakieś wyjaśnienie tego?
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");
}
}
}
Co to jest dziwny sposób na NPE, dlaczego nie po prostu "rzucić nowe NullPointerException()'? – kan
throw new NullPointerException() sprawiłoby, że bajt kodujący w trybie testMethod() byłby nieco inny. Prawdziwy kod, który próbowałem przetestować, wykorzystuje rozszerzenie kodu bajtowego i robi różnicę w tym przypadku. Jeśli mam to działać zgodnie z oczekiwaniami, to poprawię metodę testMethod(). –
podać więcej szczegółów, myślę, że możemy znaleźć lepsze podejście. Być może w teście musisz odradzić nowy wątek, klasę ładującą lub nawet instancję JVM, ale będzie to test integracyjny, a nie test jednostkowy. – kan