放心+模拟MVC @ControllerAdvice
Rest Assured + Mock MVC @ControllerAdvice
在我的项目中,我使用具有以下依赖项的 Rest Assured MockMVC:
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>2.9.0</version>
</dependency>
我的测试 class 看起来像:
TestController testController = new TestController();
@Before
public void configureRestAssuredForController() {
RestAssuredMockMvc.standaloneSetup(testController);
}
我在控制器中定义了几个 ExceptionHandlers class。
在我的 JUnit 测试中,我可以验证在控制器中定义的请求路径和处理程序 class.
但是 - 当我使用 @ControllerAdvice
将处理程序移动到单独的 class 时,处理程序不会从测试中调用。
我了解到这是因为控制器的独立设置,可能无法加载另一个 class 中定义的处理程序。
但我不知道如何在独立模式下将异常处理程序添加到 RestAssuredMockMvc 以使其工作。
我很挣扎,非常感谢任何帮助。
基于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
我将 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);
}
在我的项目中,我使用具有以下依赖项的 Rest Assured MockMVC:
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>2.9.0</version>
</dependency>
我的测试 class 看起来像:
TestController testController = new TestController();
@Before
public void configureRestAssuredForController() {
RestAssuredMockMvc.standaloneSetup(testController);
}
我在控制器中定义了几个 ExceptionHandlers class。 在我的 JUnit 测试中,我可以验证在控制器中定义的请求路径和处理程序 class.
但是 - 当我使用 @ControllerAdvice
将处理程序移动到单独的 class 时,处理程序不会从测试中调用。
我了解到这是因为控制器的独立设置,可能无法加载另一个 class 中定义的处理程序。
但我不知道如何在独立模式下将异常处理程序添加到 RestAssuredMockMvc 以使其工作。
我很挣扎,非常感谢任何帮助。
基于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
我将 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);
}