java - 测试 Spring MVC 注释映射

标签 java spring spring-mvc

使用 Spring MVC,您可以指定特定 URL 将由特定方法处理,并且您可以指定特定参数将映射到特定参数,如下所示:

@Controller
public class ImageController {

   @RequestMapping("/getImage")
   public String getImage( @RequestParam("imageId") int imageId, Map<String,Object> model ) {
      model.put("image",ImageService.getImage(imageId));
   }

}

这一切都很好,但是现在我想测试带有 imageId 参数的 http 请求是否会正确调用此方法。换句话说,如果我删除或更改任何注释,我想要一个会中断的测试。有没有办法做到这一点?

很容易测试 getImage 是否正常工作。我可以创建一个 ImageController 并使用适当的参数调用 getImage 。然而,这只是测试的一半。测试的另一半肯定是当有适当的HTTP请求进来时,Spring框架是否会调用getImage()。我觉得我也需要对这部分进行测试,尤其是作为我的@RequestMapping 注释变得更加复杂并调用复杂的参数条件。

如果我删除第 4 行 @RequestMapping("getImage"),你能告诉我一个会中断的测试吗?

最佳答案

您可以使用 AnnotationMethodHandlerAdapter及其 handle 方法以编程方式。这将解析给定请求的方法并执行它。不幸的是,这有点间接。实际上,在 AMHA 中有一个名为 ServletHandlerMethodResolver 的私有(private)类,它只负责解析给定请求的方法。我刚刚提交了 request for improvement关于那个话题,因为我真的很想看到这也是可能的。

与此同时,您可以使用例如EasyMock要创建 Controller 类的模拟,期望调用给定的方法并将模拟交给 handle

Controller :

@Controller
public class MyController {

  @RequestMapping("/users")
  public void foo(HttpServletResponse response) {

    // your controller code
  }
}

测试:

public class RequestMappingTest {

  private MockHttpServletRequest request;
  private MockHttpServletResponse response;
  private MyController controller;
  private AnnotationMethodHandlerAdapter adapter;


  @Before
  public void setUp() {

    controller = EasyMock.createNiceMock(MyController.class);

    adapter = new AnnotationMethodHandlerAdapter();
    request = new MockHttpServletRequest();
    response = new MockHttpServletResponse();
  }


  @Test
  public void testname() throws Exception {

    request.setRequestURI("/users");

    controller.foo(response);
    EasyMock.expectLastCall().once();
    EasyMock.replay(controller);

    adapter.handle(request, response, controller);

    EasyMock.verify(controller);
  }
}

问候, 奥利

关于java - 测试 Spring MVC 注释映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/861089/

相关文章:

java - Tomcat 8 无法加载网站

java - 编写一个方法以随机顺序播放轨道列表中的每个轨道一次

spring - Intellij 顶级元素未完成

hibernate - Hibernate 和 Spring 的配置问题

spring - 避免在 Spring MVC 中导致 "400 - Bad Request"状态代码的 POST 请求

java - 在网络级别上在 AWS 和 localstack 之间切换

java - 如何在 Android 中从数组中提取字符串?

java - 为 Spring Boot 应用程序构建了两个 JAR

java - RequestMapping 无法填充实体类,其中 EmbeddedId 中的字段

java - Thymeleaf &lt;input&gt; 日期出现 :pattern 错误