为本地@ExceptionHandler编写JUnit测试

时间:2014-09-05 13:37:25

标签: java spring spring-mvc junit

我有以下控制器:

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) {}
}

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

3 个答案:

答案 0 :(得分:2)

使用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());
 }

这是有效的,因为ExceptionHandlerExceptionResolver是Spring MVC用于根据@ExceptionHandler注释处理异常的类

查看one我旧的相关答案,其中涵盖了一个更加困难的案例(在@ControllerAdvice的某个类中使用@ExceptionHandler)。

答案 1 :(得分:0)

班级net.scansafe.scancentre21.springmvc.web.easyid.ManageSamlAuthenticationRealmController.verifySecondarySamlSpCertificate(ManageSamlAuthenticationRealmController.java)中的媒体资源为空。

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

答案 2 :(得分:-1)

我以这种方式解决了:

`@Test(expected = MyException.class)     公共无效shouldThrowException()会引发IOException,Exception {

     //Mock Response Controller 

当(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());`