文档章节

SpringMVC 测试框架 MockMvc 天坑一枚

打雷要下雨LEO
 打雷要下雨LEO
发布于 2016/10/04 19:30
字数 450
阅读 934
收藏 3

最近使用SpringMvc写一个URL比较复杂的RequestMapping,最后使用MockMvc测试下URL。

出现的问题是根本不存在的URI,居然返回200。使用以下代码测试:

 

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({
        "classpath:spring/spring-web.xml"
})
public class SearchControllerTest {
    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testURLMapping() throws Exception {
        String[] testCase= {
            "/asdf"    // 根本不存在
        };
        for (String url : testCase) {
            this.mockMvc.perform(MockMvcRequestBuilders.get(url))
                    .andDo(MockMvcResultHandlers.print())  // 输出信息
                    .andExpect(MockMvcResultMatchers.status().isOk());

        }
    }
}

测试通过,但是项目跑起来浏览器看HTTP请求返回的是404,输出的信息如下:

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /asdf
       Parameters = {}
          Headers = {}

Handler:
             Type = org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200  // 200!
    Error message = null
          Headers = {}
     Content type = null
             Body = 
    Forwarded URL = default  // 问题的关键!
   Redirected URL = null
          Cookies = []

问题的关键就是Forward那里,这个问题三年前有人反馈过了(https://jira.spring.io/browse/SPR-10695)。

具体原因:

内部进行URL匹配未找到会重定向到default setvlet再返回404错误,这个重定向是在Tomcat内部完成的,客户端是察觉不到的。SpringMvc作为一个servlet可以看责任链模式上的一棒,这个不匹配的请求其实和CSS、Js等静态文件一样最后传递给了Tomcat的default,最终是Tomcat抛出的404错误。MockMvc毕竟不是模拟浏览器访问,MockMvc并不能发现404错误,以上是我个人的理解,推荐看一下上面的链接。

改进办法:

MockMvc并不知道不匹配的请求最后Tomcat怎样处理的,但是可以知道这个请求是在Spring内完成的还是最后做了重定向。修改成如下测试代码:

this.mockMvc.perform(MockMvcRequestBuilders.get(url))
        .andDo(MockMvcResultHandlers.print())
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andExpect(forwardedUrl(null));

完成!

© 著作权归作者所有

共有 人打赏支持
打雷要下雨LEO
粉丝 11
博文 13
码字总数 4328
作品 0
深圳
程序员
spring-mvc junit test

在spring-mvc中测试controller层,一般比较麻烦,因为没有web容器中的那种上下文环境,而启动容器测试又不够优雅。 maven依赖,其中需要注意的是用到了spring-test-mvc,这么一个框架。 <dep...

隆回水哥
2015/05/22
0
0
spring 3.2.0ga 测试框架

spring3.2终于出ga版了, 发现spring test的改进最大,添加了对 springmvc的测试 看了看文档,将使用方法整理如下: 1,可以使用 @WebAppConfiguration来标明是web应用测试, @ContextConfig...

big-hero
2012/12/20
0
1
Spring MVC测试框架详解——服务端测试

随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的。从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用spring-test-mvc项目(合并到spring3.2...

铂金小猪4号
2014/01/17
0
3
实践Jenkins集成Cobertura自动化构建SpringBoot工程

热文推荐: 你的微服务敢独立交付么? 理解JWT的使用场景和优劣 从Spring-Session源码看Session机制的实现细节 理解使用 JWT 设计的单点登录系统 JDK 1.5 - 1.8 各版本的新特性总结 Spring B...

程序猿DD
04/28
0
0
junit 集成spring报错: GenericApplicationContext cannot be cast to WebApplicationContext

公司这个项目,不是我来配置构建的, 把 spring的配置什么的,和 springmvc的配置没有区分开来,都是在一个配置文件里面,也就是 springmvc 里面。和我们一般的 配置不一样,我们一般配置都是...

之渊
2017/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
1
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部