2016-06-26 30 views
1

在我的項目,我使用放心MockMVC具有以下依賴性:放心+模擬MVC @ControllerAdvice

<dependency> 
    <groupId>com.jayway.restassured</groupId> 
    <artifactId>spring-mock-mvc</artifactId> 
    <version>2.9.0</version> 
</dependency> 

我的測試類的樣子:

TestController testController = new TestController(); 
@Before 
public void configureRestAssuredForController() { 
    RestAssuredMockMvc.standaloneSetup(testController); 
} 

我有幾個控制器類中定義的ExceptionHandlers。 在我的JUnit測試中,我可以在控制器類中定義時驗證請求路徑和處理程序。

但是 - 當我將處理程序移至與@ControllerAdvice分開的類別時,處理程序不會從測試中調用。

我知道這是因爲控制器的獨立設置,它可能無法加載另一個類中定義的處理程序。

但我無法弄清楚如何將異常處理程序添加到RestAssuredMockMvc,以獨立模式進行工作。

我正在努力,任何幫助,非常感謝請。

+0

歡迎來到Stack Overflow!我編輯了你的問題,讓你的代碼示例縮進4個空格,以便正確呈現 - 請參閱編輯幫助以獲取有關格式化的更多信息。請編輯以提供識別特定問題所需的任何其他詳細信息。祝你好運! – Wtower

回答

1

基於this answer我已經創建了我的偉大工程的解決方案:

/** 
* Initializes GlobalExceptionHandler advice using the StaticApplicationContext with the single bean. 
* 
* @return HandlerExceptionResolver instantiated based on the GlobalExceptionHandler 
*/ 
private HandlerExceptionResolver initGlobalExceptionHandlerResolvers() { 
    StaticApplicationContext applicationContext = new StaticApplicationContext(); 
    applicationContext.registerSingleton("exceptionHandler", GlobalExceptionHandler.class); 

    WebMvcConfigurationSupport webMvcConfigurationSupport = new WebMvcConfigurationSupport(); 
    webMvcConfigurationSupport.setApplicationContext(applicationContext); 

    return webMvcConfigurationSupport.handlerExceptionResolver(); 
} 

@Before 
public void setup() { 
    HandlerExceptionResolver handlerExceptionResolver = initGlobalExceptionHandlerResolvers(); 

    RestAssuredMockMvc.standaloneSetup(
      MockMvcBuilders 
        .standaloneSetup(controller) 
        .setHandlerExceptionResolvers(handlerExceptionResolver) 
    ); 
} 

所以我GlobalExceptionHandler使用StaticApplicationContext,然後我從中檢索handlerExceptionResolver並把它傳遞到RestAssuredMockMvc standaloneSetup

+0

你有你的代碼的其餘部分的副本。控制器和測試類減速? – ptimson

+0

工程優秀! – Krzysiek

3

初始化我將Spring升級到4.3.1.RELEASE,並執行以下操作以使其正常工作 -

GlobalControllerExceptionHandler globalControllerExceptionHandler = new GlobalControllerExceptionHandler(); @Before public void given_rest_assured_is_configured_with_cloud_study_controller() throws Exception { mockMvc = MockMvcBuilders.standaloneSetup(cloudStudyCountryController) .setControllerAdvice(globalControllerExceptionHandler).build(); RestAssuredMockMvc.mockMvc(mockMvc); dataObj.setCloudDataObjectCreateProcessor(createprocessor); }