如何对由Spring MVC控制器发送的ResponseBody或ResponseEntity进行单元测试?

6

当我进行junit测试时,我会像这样测试Spring MVC控制器:

request.setRequestURI("/projects/"+idProject+"/modify");
ModelAndView mv = handlerAdapter.handle(request, response, controller);

控制器测试的条件是:

@RequestMapping(value = "{id}/modify")
public String content(ModelMap model, @PathVariable("id") Project object) {

但我不知道如何获取像这样定义的请求处理程序的ResponseBody响应:

@RequestMapping("/management/search")
public @ResponseBody ArrayList<SearchData> search(@RequestParam("q")) {
        ....
                ....
        ArrayList<SearchData> datas = ....;

        return datas;
    }

在寻找解决方案时,我发现另一个适用于我的情况的解决方案:https://dev59.com/OGox5IYBdhLWcg3wi03F。它似乎非常容易实现,并且与我的测试代码非常匹配。 - emas
1个回答

3

您的单元测试只需要验证方法返回值的内容:

ArrayList<SearchData> results = controller.search("value");
assertThat(results, ...)
@ResponseBody注解是无关紧要的。这是使用注解控制器的一个重大优点——您的单元测试可以专注于业务逻辑,而不是框架机制。对于预注解控制器,您的一半测试代码都花在构建模拟请求、响应和相关的琐碎细节上了。这会分散注意力。
测试代码的注解与框架的集成是否正确是集成测试和/或功能测试的工作。

此外,对于ResponseEntity结果,您只需调用getBody来获取结果。即,ResponseEntity<MyObject> results = controller.search("value"); MyObject obj = results.getBody(); assertThat(obj, ...) - digitaljoel
我希望引用自己的博客不会有什么不妥之处。在二月份,我写了一些与测试控制器直接相关的条目。链接如下:http://digitaljoel.nerd-herders.com/2011/02/05/mock-testing-spring-mvc-controller/ 和 http://digitaljoel.nerd-herders.com/2011/02/05/using-mockito-to-test-spring-mvc-ajax-interaction/,后者测试了一个返回ResponseEntity的方法。 - digitaljoel
好的,谢谢您的回答skaffman,您是正确的,我只需要验证返回值的内容。 - Nico
谢谢digitaljoel,我会看看你的博客,它可能对我非常有趣 :) - Nico
5
我不同意这个答案。测试注释、请求参数等非常重要。当作者使用 HandlerAdapter 时,他是正确的。 - egervari
1
@egervari:我并没有说它不重要,正如我的最后一句话所说的那样,我说这不是单元测试的工作。 - skaffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接