以下のサンプルコードでは、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