【发布时间】:2020-05-22 02:55:40
【问题描述】:
我正在为以下 Java 代码编写单元测试:
try {
new Thread(() -> myService.myMethod()).start();
return new MyResponse("Done");
} catch (Exception exception) {
throw new MyException("Internal Error", exception);
}
我正在尝试模拟 myService.myMethod() 引发的错误,以便在上面代码的 catch 块中拾取它并引发 MyException 的实例。
在我的 JUnit 测试中(使用 org.springframework.test.context.junit4.SpringJUnit4ClassRunner 和 Mockito),我模拟了 MyService 并将其作为 Spring bean 注入到单元测试中:
MyService myService = Mockito.mock(MyService.class);
然后我尝试了这个来模拟服务抛出异常:
IllegalArgumentException myException = new IllegalArgumentException();
Mockito.doThrow(myException).when(myService).myMethod();
...但是我正在测试的方法的 catch 块中永远不会发现异常。
这可能与代码使用另一个线程来调用 myService.myMethod() 的事实有关。
有什么方法可以让 myService.myMethod() 抛出的异常被正确捕获?
提前感谢您的帮助。
【问题讨论】:
-
如果方法在启动线程后返回,然后在线程中稍后发生异常,您希望代码会发生什么?
-
如果线程中的进程抛出异常,它应该被catch()捕获,不是吗?
-
不,只有当异常显示在 catch 块中的触发时才会被捕获。您正在创建一个新线程,该线程将在未来某个时间点运行,而当前线程将继续返回,然后退出 catch 块。您可以将
uncaughtExceptionHandler附加到新线程。