【问题标题】:Spring MVC mockingSpring MVC 模拟
【发布时间】:2014-02-10 19:50:34
【问题描述】:

我正在尝试使用 Spring 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:

我该如何解决这个问题?怎么了?

底线是我想对我的 rest api 进行单元测试。例如,当我添加了异常处理程序时,我应该怎么做?

【问题讨论】:

  • 此链接可能会对您有所帮助,因为作者还展示了如何测试 rest api 的预期异常以及其他测试。 > petrikainulainen.net/programming/spring-framework/…
  • 你能举一个测试失败和通过的例子吗?我们必须查看您的异常处理程序和控制器方法。
  • 我想我误解了它的用法。我将查看没有 Rest Assured 的 Spring MVC 测试框架并尝试一些示例。

标签: java spring unit-testing jakarta-ee spring-mvc


【解决方案1】:

底线是我想对我的 rest api 进行单元测试。我应该怎么做 例如,当我添加了异常处理程序时?

首先,我会使用内置的 spring mock 框架,从 3.2 版本开始提供,但并不放心(它可能很好,但无法想象它也被集成了)。这可能涵盖了getting started 的基础知识。

其次,您可以在测试方法中只使用try and catch,然后在布尔值上断言是否引发了异常。或者测试是否从控制器返回异常消息,例如对状态代码 500 执行期望。这将取决于您的 api。

【讨论】:

  • 你是第一个带领我走向正确方向的人。我已经阅读了 Spring testing 的文档并且我得到了它的工作。 Spring MVC 框架就是答案。我想我设法混合了来自两个不同框架等的类。
【解决方案2】:

尝试使用accept():

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我应该在哪里设置这个?除了在控制器上设置一些模拟对象之外,我所做的就是在测试方法中这样做:RestAssuredMockMvc.given().when().get("cars/1").then().statusCode(404);
    猜你喜欢
    • 2017-11-16
    • 2018-01-29
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多