2014-02-10 111 views
3

我想用Spring MVC模拟模块来单元测试我的控制器。我添加了这个:春天MVC嘲笑

@Before 
    public void beforeTest() { 
     MockitoAnnotations.initMocks(this); 
     standaloneSetup(new CarController()); 
    } 

它工作正常。但是,我创建了一个控制器建议,其中有一个注解为@ExceptionHandler的方法。我想测试它在单元测试期间的工作情况。我看到了,我可以建立一个MockMvc对象,并传递到standaloneSetup(..)

MockMvcBuilders.standaloneSetup(
    new CarController()).setHandlerExceptionResolvers(...).build(); 

然而,当我这个做那个检查异常处理程序的工作原理通行证,但所有jsonpath失败,并访问响应其它测试的测试此错误:

java.lang.IllegalStateException: Expected response body to be verified as JSON, 
    HTML or XML but content-type 'null' is not supported out of the box. 
Try registering a custom parser using: 
    RestAssured.registerParser("null", <parser type>); 
Content was: 

如何解决此问题?哪里不对?

底线是,我想单元测试我的休息api。当我为实例添加异常处理程序时,应如何执行此操作?

+0

你能举一个测试失败的例子吗?我们必须看到你的异常处理程序和控制器方法。 –

+0

我想我误解了一下这个用法。我将在没有Rest Assured的情况下查看Spring MVC测试框架并尝试一些示例。 – LuckyLuke

回答

1

Bottom line is that I want to unit test my rest api. How should I do this when I have added a exception handler for instance?

对于一个我会使用内置的春天模拟框架,从3.2版本,而不是放心(这可能是好的,但可以;难以想象它集成以及)。这可能涵盖了getting started的基础知识。其次,您可以在您的测试方法中使用try and catch,然后在布尔值上声明是否抛出异常。或者,例如,测试是否从控制器执行期望的状态代码500返回异常消息。这将取决于你的api。

+0

你是第一个领导我走向正确方向的人。我已经阅读了Spring测试的文档,并且它能够正常工作。 Spring MVC框架就是答案。我想我设法混合来自两个不同框架的类等 – LuckyLuke

0

请求的模拟内容类型为null,因此spring mvc无法确定它应该调用哪个方法。如果你将值设置为application/html + xml,application/json等,它应该可以正常工作。

+0

我应该在哪里设置?除了在控制器上设置一些模拟对象,我所做的只是在测试方法中:'RestAssuredMockMvc.given()。when()。get(“cars/1”)。then()。statusCode(404);' – LuckyLuke

1

尝试使用接受():

mockMvc.perform(post("/hotels/{id}", 42).accept(MediaType.APPLICATION_JSON)); 

建设MockMvc时,您还可以设置的返回类型。

mockMvc = standaloneSetup(new AccountController()) 
     .defaultRequest(get("/") 
     .contextPath("/app").servletPath("/main") 
>>  .accept(MediaType.APPLICATION_JSON).build(); 

http://docs.spring.io/spring/docs/4.0.1.RELEASE/spring-framework-reference/htmlsingle/#unit-testing-spring-mvc

您需要在过程的正确的MediaType值传递。

+0

感谢这对我工作 – Romell