2014-09-05 111 views
3

我有以下控制器:寫JUnit測試本地@ExceptionHandler

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

我的目標是到控制器重定向到的異常處理程序,如果證書無效。

+0

因爲這是你的設置。如果您想要設置完整的應用程序上下文,您只需測試控制器而不是剩餘的基礎架構。 – 2014-09-05 13:42:24

+0

注意'standaloneSetup'。檢查其他'MockMvcBuilders'方法。 – 2014-09-05 14:48:33

回答

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)。

+0

謝謝,我試過你的方法。但不幸的是,我得到以下錯誤:org.springframework.web.util.NestedServletException:請求處理失敗;嵌套的異常是java.lang.NullPointerException – fashuser 2014-09-05 15:11:34

+0

@fashuser這很奇怪!我運行這個代碼,一切都按預期工作!你能用這個信息更新你的問題嗎? – geoand 2014-09-05 15:12:40

+0

我已經添加了完整的堆棧跟蹤問題。 – fashuser 2014-09-05 15:22:08

0

您的班級net.scansafe.scancentre21.springmvc.web.easyid.ManageSamlAuthenticationRealmController.verifySecondarySamlSpCertificate(ManageSamlAuthenticationRealmController.java)中的某個房產爲空。

您可以調試類的方法來找到它。你需要添加一個@Autowired注入這個屬性。