文档章节

SpringMVC 测试框架 MockMvc 天坑一枚

打雷要下雨LEO
 打雷要下雨LEO
发布于 2016/10/04 19:30
字数 450
阅读 865
收藏 3
点赞 0
评论 0

最近使用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
粉丝 10
博文 14
码字总数 4886
作品 0
深圳
程序员
实践Jenkins集成Cobertura自动化构建SpringBoot工程

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

程序猿DD ⋅ 04/28 ⋅ 0

Spring、Spring Boot 和 TestNG 测试指南 ( 6 )

原文出处:chanjarster Spring Testing Framework提供了Spring MVC Test Framework,能够很方便的来测试Controller。同时Spring Boot也提供了Auto-configured Spring MVC tests更进一步简化了...

chanjarster ⋅ 2017/12/11 ⋅ 0

spring 3.2.0ga 测试框架

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

tiantian_orz ⋅ 2012/12/20 ⋅ 1

Spring MVC测试框架详解——服务端测试

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

铂金小猪4号 ⋅ 2014/01/17 ⋅ 3

springMVC4+mybatis+Druid+Maven

整个框架结构 pom.xml web.xml spring-mvc.xml 通过实践这个路径不行,扫描找不到要注入的类,只能把mapping文件放在resources下 spring-mybatis.xml mybatis-config.xml jdbc.properties ma...

lcyanxi ⋅ 2016/11/18 ⋅ 0

spring-test单元测试(三)-spring mvc请求测试

上篇文章中我们介绍了如何在struts环境下,进行模拟action的请求测试,以及我们使用了EasyMock框架,来模拟对象的行为。这篇文章我们会继续介绍spring mvc环境下如何对controller进行单元测试...

新栋BOOK ⋅ 2016/11/26 ⋅ 0

SpringMVC3.2.x整合Fastjson与Controller单元测试

SpringMVC与Fastjson整合相当简单,只要在pom引入fastjson包后,配置一下SpringMVC的messageConverter就可以使用了。 但是如果在单元测试时,使用mockMvc测试controller 此时会报406错误,也...

bfleeee ⋅ 2014/10/20 ⋅ 0

spring mvc 单元测试

最近在写单元测试,遇到一些坑和大家分享一下。 之前我们一直有service层的单元测试,但是没有action层的单元测试,正好我们用到spring mvc,所以就用了spring-test做单元测试, spring mvc...

internetafei ⋅ 2014/12/25 ⋅ 0

Spring Boot应用的测试——Mockito

Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试;生成测试数据初始化数据库用于测试;Spring Boot可以跟BDD(Behavier Driven Development)工具、Cucumber和...

xiaomin0322 ⋅ 01/12 ⋅ 0

springMVC的单元测试

Controller层 模拟的测试类 更多的模拟请求案例点这里 解释一下几个参数的含义 mockMvc.perform执行一个请求; MockMvcRequestBuilders.get("/book_edit/{id}")构造一个请求 ResultActions....

lcyanxi ⋅ 2016/11/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 20分钟前 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 38分钟前 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 今天 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 今天 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 今天 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 今天 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 今天 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部