gpt4 book ai didi

Java Thread.currentThread().setUncaughtExceptionHandler() 不适用于 JUNIT?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:15 27 4
gpt4 key购买 nike

在下面的示例代码中,如果 testMethod() 通过 main() 运行,它将按预期工作,但如果通过 JUNIT 运行,则不会调用 MyUncaughtExceptionHandler。

有什么解释吗?

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");
}
}
}

最佳答案

显然,setUncaughtExceptionHandler 为未捕获的异常设置处理程序。但是 JUnit 会捕获测试方法抛出的所有异常。

无论如何,这是进行单元测试的奇怪方式。单元测试应该测试您的代码,而不是 JVM 规范。

我想象这样的单元测试:

public class MyUncaughtExceptionHandlerTest
{
@Mock Thread thread;
MyUncaughtExceptionHandler testObject = new MyUncaughtExceptionHandler();

@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
}

@Test
public void handleNpeShouldDoOneThing()
{
testObject.handleException(thread, new NullPointerException());
//verify(oneThing)
}

@Test
public void handleOomShouldDoSomethingElse()
{
testObject.handleException(thread, new OutOfMemoryError());
//verify(somethingElse)
}
}

关于Java Thread.currentThread().setUncaughtExceptionHandler() 不适用于 JUNIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17994335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com