Java 为本地@ExceptionHandler编写JUnit测试

Java 为本地@ExceptionHandler编写JUnit测试,java,spring,spring-mvc,junit,Java,Spring,Spring Mvc,Junit,我有以下控制器: class Controller { @ResponseStatus(HttpStatus.OK) @RequestMapping(value = "/verifyCert", method = RequestMethod.GET) public void verifyCertificate() throws CertificateExpiredException, CertificateNotYetValidException { c

我有以下控制器:

class Controller {

    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/verifyCert", method = RequestMethod.GET)
    public void verifyCertificate() throws CertificateExpiredException, CertificateNotYetValidException {
        certificate.checkValidity();
    }

    @ResponseStatus(HttpStatus.FORBIDDEN)
    @ExceptionHandler({CertificateExpiredException.class, CertificateNotYetValidException.class})
    public void handleCertificateValidityException(Exception e) {}
}

我的目标是,如果证书无效,控制器将重定向到异常处理程序。

当使用
standaloneSetup
时,您所做的只是为特定控制器执行设置

如果不想配置整个应用程序上下文(将使用
webAppContextSetup
而不是
standaloneSetup
),可以通过将代码更改为以下内容手动设置异常处理程序:

 @Before
 public void setup() throws IOException {
     MockitoAnnotations.initMocks(this);
     mockMvc = MockMvcBuilders.standaloneSetup(controller).setHandlerExceptionResolvers(new ExceptionHandlerExceptionResolver()).build();
 }

 @Test
 public void test() throws Exception {
     mockMvc.perform(get("/verifyCert.controller").contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)).andExpect(status().isForbidden());
 }
这是因为Spring MVC使用类来处理基于
@ExceptionHandler
注释的异常


查看我以前的相关答案,这些答案涵盖了一个更加困难的情况(在包含
@ExceptionHandler
的类上使用
@ControllerAdvice
)。

类中的属性
net.scansafe.scancentre21.springmvc.web.easyid.ManageSamlAuthenticationRealmController.verifysecondary samlspcertificate(ManageSamlAuthenticationRealmController.java)
为空


您可以调试类的方法以找到它。您需要将@Autowired添加到此属性以进行注入。

我用这种方式解决了:

@Test(expected=MyException.class)
public void shouldThrowException() throws IOException, Exception {

    //Mock Response Controller 
    when(client.mymethod(any(MyInputClassOfController.class)))
        .thenReturn(mockedResponse);

    when(innerClassInController.myMethodThatInvokeTheException(mock(MyClass.class)))
        .thenThrow(new MyException("message"));

    this.mockMvc.perform(post("/root/search/")
        .contentType(MediaType.APPLICATION_JSON_UTF8)
        .content( "null Request to throw the exception"))
        .andExpect(status().isBadRequest());
}

因为这就是您所设置的。如果需要设置完整的应用程序上下文,您只测试控制器而不是剩余的基础结构。请注意
standaloneSetup
。检查其他
MockMvcBuilders
方法。谢谢,我尝试了您的方法。但不幸的是,我得到了以下错误:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常为java.lang。NullPointerException@fashuser这太奇怪了!我运行了这段代码,一切正常!你能用这些信息更新你的问题吗?我已经为问题添加了完整的堆栈跟踪。@fashuser你使用的是哪个版本的Spring?@fashuser我不是le用Spring 4或Spring 3.2重现您的问题