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重现您的问题