文档章节

SpringMVC 测试框架 MockMvc 天坑一枚

打雷要下雨LEO
 打雷要下雨LEO
发布于 2016/10/04 19:30
字数 450
阅读 1013
收藏 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
Spring Boot单元测试

一个测试类包含下面两个注解: @RunWith(SpringRunner.class)@SpringBootTest 测试类中可直接注入接口: @ResourceMyServerMgr myServerMgr; 在方法上加@Test表示它是个测试方法: @Testpub...

日进一步
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

macOs-挂载能读写的NTFS硬盘

转自:https://nicklinyi.gitee.io/blog/2018/04/macOS-ntfs.html Mac本身是支持NTFS写入的,只是NTFS是微软开发,由于版权和技术细节原因,苹果不愿公开说自己支持NTFS写入,也是有自己以后...

北风刮的不认真了
29分钟前
2
0
Namespace 命名空间

命名空间可以定义为一种封装方式。 为了解决开发中库和程序中可重用类和方法问题: 1.解决 PHP内部方法类/方法/常量 或者第三方 类/方法/常量之间的命名冲突 2.能够简化为了防止命名冲突而给...

忙碌的小蜜蜂
32分钟前
1
0
CDH的坑之Deploy Client Configuration Failed

Deploy Client Configuration Failed 1.问题描述 当使用CDH增添spark服务的时候,出现了以下错误: Faile to deploy client configuration to the cluster. 具体如下图: 2.思路 网上查了...

星汉
33分钟前
2
0
java guava 集合的操作:交集、差集、并集

Guava:google的工程师利用传说中的“20%时间”开发的集合库,它是对jdk提供的扩展,提供了很多实用的类来简化代码。 开源地址:https://github.com/google/guava jar包下载:http://maven....

帅的不像男的
33分钟前
2
0
从八个层面比较分析 Java 8, RxJava, Reactor

响应式编程在单机环境下是否鸡肋? 结论是:没有结论,我觉得只能抱着怀疑的眼光审视这个问题了。另外还聊到了 RSocket 这个最近在 SpringOne 大会上比较火爆的响应式”新“网络协议,githu...

小刀爱编程
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部