使用 Spring RestController+ExceptionHandler Annotation 使用 Mockito 模拟 ExceptionHandler

Nin*_*ina 5 java junit spring unit-testing spring-mvc

我正在尝试 JUnit 测试 Spring @RestController 的异常处理。

@RestController
public class MyController {
Run Code Online (Sandbox Code Playgroud)

异常处理在类 ErrorHandler 中完成。

@ControllerAdvice
public class ErrorHandler extends ResponseEntityExceptionHandler {
Run Code Online (Sandbox Code Playgroud)

我正在使用 Mockito,因为它非常方便。但是现在我无法弄清楚如何使 ErrorHandler 与 RestController 一起工作。

@RunWith(MockitoJUnitRunner.class)
public class MyControllerTest {

   @InjectMocks
   private MyController controller;

   @Mock
   private MyService myService;

   @Spy
   private ErrorHandler errorHandler;
Run Code Online (Sandbox Code Playgroud)

如您所见,我尝试使用 @Spy 使“真正的” ErrorHandler 与注入了模拟的控制器一起工作。

但它不是这样工作的。

@Test
public void testDoWork_InternalServiceException() {
    MyRequest request = getDefaultRequest();
    Mockito.when(myService.check(request)).thenThrow(new RuntimeException());       
    ResponseEntity<StatusResponse> response = controller.doWork(request);
}
Run Code Online (Sandbox Code Playgroud)

如果我调用控制器的方法,它现在当然会抛出异常并且永远不会调用 ErrorHandler 类。

有没有办法使用 Mockito 测试 @RestController 类和其他 @ControllerAdvice 异常处理程序类的异常处理?

非常感谢您的建议。