Rest Assured + Mock MVC @ControllerAdvice

时间:2016-06-26 04:23:12

标签: rest unit-testing rest-assured mockmvc

在我的项目中,我使用具有以下依赖关系的Rest Assured MockMVC:

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

我在控制器类中定义了几个ExceptionHandler。 在我的JUnit测试中,我可以在控制器类中定义时验证请求路径和处理程序。

但是 - 当我将处理程序移动到具有@ControllerAdvice的单独类时,不会从测试中调用处理程序。

我明白这是因为控制器的独立设置,可能无法加载另一个类中定义的处理程序。

但是我无法弄清楚如何在独立模式下将异常处理程序添加到RestAssuredMockMvc以使其工作。

我很挣扎,请帮助我们。

2 个答案:

答案 0 :(得分: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); }

答案 1 :(得分: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