MockMvc-springframework(二)

JSON请求/响应验证

测试时需要安装jacksonJson和JsonPath依赖: 

Java代码 <dependency>     <groupId>com.fasterxml.jackson.core</groupId>     <artifactId>jackson-databind</artifactId>     <version>${jackson2.version}</version> </dependency>   <dependency>     <groupId>com.jayway.jsonpath</groupId>     <artifactId>json-path</artifactId>     <version>${jsonpath.version}</version>     <scope>test</scope> </dependency>         <dependency>

           <groupId>com.fasterxml.jackson.core</groupId>

           <artifactId>jackson-databind</artifactId>

           <version>${jackson2.version}</version>

        </dependency>

        <dependency>

           <groupId>com.jayway.jsonpath</groupId>

           <artifactId>json-path</artifactId>

           <version>${jsonpath.version}</version>

           <scope>test</scope>

        </dependency>

版本:<jsonpath.version>0.9.0</jsonpath.version>、<jackson2.version>2.2.3</jackson2.version> 

 

Java代码

 

StringrequestBody = "{\"id\":1,\"name\":\"zhang\"}";

       mockMvc.perform(post("/user")

                   .contentType(MediaType.APPLICATION_JSON).content(requestBody)

                   .accept(MediaType.APPLICATION_JSON)) //执行请求

               .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //验证响应contentType

               .andExpect(jsonPath("$.id").value(1)); //使用Json path验证JSON 请参考http://goessner.net/articles/JsonPath/

        String errorBody ="{id:1, name:zhang}";

        MvcResult result =mockMvc.perform(post("/user")

               .contentType(MediaType.APPLICATION_JSON).content(errorBody)

               .accept(MediaType.APPLICATION_JSON)) //执行请求

               .andExpect(status().isBadRequest()) //400错误请求

               .andReturn();

       Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//错误的请求内容体

 

XML请求/响应验证

测试时需要安装springoxm和xstream依赖: 

Java代码 <dependency>     <groupId>com.thoughtworks.xstream</groupId>     <artifactId>xstream</artifactId>     <version>${xsream.version}</version>     <scope>test</scope>  </dependency>   <dependency>     <groupId>org.springframework</groupId>     <artifactId>spring-oxm</artifactId>     <version>${spring.version}</version>     <scope>test</scope> </dependency>         <dependency>

           <groupId>com.thoughtworks.xstream</groupId>

           <artifactId>xstream</artifactId>

           <version>${xsream.version}</version>

           <scope>test</scope>

        </dependency>

        <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-oxm</artifactId>

           <version>${spring.version}</version>

           <scope>test</scope>

        </dependency>

版本:<xstream.version>1.4.4</xstream.version>

 

Java代码

 

 //XML请求/响应

        String requestBody ="<user><id>1</id><name>zhang</name></user>";

       mockMvc.perform(post("/user")

               .contentType(MediaType.APPLICATION_XML).content(requestBody)

               .accept(MediaType.APPLICATION_XML)) //执行请求

               .andDo(print())

               .andExpect(content().contentType(MediaType.APPLICATION_XML)) //验证响应contentType

               .andExpect(xpath("/user/id/text()").string("1")); //使用XPath表达式验证XML 请参考http://www.w3school.com.cn/xpath/

        String errorBody ="<user><id>1</id><name>zhang</name>";

        MvcResult result =mockMvc.perform(post("/user")

               .contentType(MediaType.APPLICATION_XML).content(errorBody)

               .accept(MediaType.APPLICATION_XML)) //执行请求

               .andExpect(status().isBadRequest()) //400错误请求

               .andReturn();

       Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//错误的请求内容体

 

异常处理  

Java代码 

 

 //异常处理

        MvcResultresult = mockMvc.perform(get("/user/exception")) //执行请求

               .andExpect(status().isInternalServerError()) //验证服务器内部错误

               .andReturn();

       Assert.assertTrue(IllegalArgumentException.class.isAssignableFrom(result.getResolvedException().getClass()));

 

静态资源 

Java代码 

 

 //静态资源

       mockMvc.perform(get("/static/app.js")) //执行请求

               .andExpect(status().isOk()) //验证状态码200

               .andExpect(content().string(CoreMatchers.containsString("var")));//验证渲染后的视图内容包含var

       mockMvc.perform(get("/static/app1.js")) //执行请求

               .andExpect(status().isNotFound());  //验证状态码404

异步测试 

Java代码 

 

//Callable

        MvcResultresult = mockMvc.perform(get("/user/async1?id=1&name=zhang")) //执行请求

               .andExpect(request().asyncStarted())

               .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class))) //默认会等10秒超时

               .andReturn();

       mockMvc.perform(asyncDispatch(result))

               .andExpect(status().isOk())

               .andExpect(content().contentType(MediaType.APPLICATION_JSON))

               .andExpect(jsonPath("$.id").value(1));

Java代码

 

//DeferredResult

        result =mockMvc.perform(get("/user/async2?id=1&name=zhang")) //执行请求

               .andExpect(request().asyncStarted())

               .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))  //默认会等10秒超时

               .andReturn();

       mockMvc.perform(asyncDispatch(result))

               .andExpect(status().isOk())

               .andExpect(content().contentType(MediaType.APPLICATION_JSON))

               .andExpect(jsonPath("$.id").value(1));

此处请在第一次请求时加上andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class)))这样会等待结果返回/超时,无须自己设置线程等待了;此处注意request().asyncResult一定是在第一次请求发出;然后第二次通过asyncDispatch进行异步请求。

 

添加自定义过滤器

Java代码  mockMvc =webAppContextSetup(wac).addFilter(new MyFilter(),"/*").build(); mockMvc.perform(get("/user/1"))         .andExpect(request().attribute("filter", true));         mockMvc = webAppContextSetup(wac).addFilter(new MyFilter(),"/*").build();

       mockMvc.perform(get("/user/1"))

               .andExpect(request().attribute("filter", true));

 

全局配置 

Java代码  mockMvc =webAppContextSetup(wac)         

.defaultRequest(get("/user/1").requestAttr("default",true)) //默认请求 如果其是Mergeable类型的,会自动合并的哦mockMvc.perform中的RequestBuilder         

 .alwaysDo(print())  //默认每次执行请求后都做的动作         

.alwaysExpect(request().attribute("default", true)) //默认每次执行后进行验证的断言         

 .build();   

mockMvc.perform(get("/user/1"))         

 .andExpect(model().attributeExists("user"));         

 mockMvc = webAppContextSetup(wac)

 .defaultRequest(get("/user/1")

.requestAttr("default", true)) //默认请求 如果其是Mergeable类型的,会自动合并的哦mockMvc.perform中的RequestBuilder

               .alwaysDo(print())  //默认每次执行请求后都做的动作

               .alwaysExpect(request().attribute("default", true)) //默认每次执行后进行验证的断言

               .build();

       mockMvc.perform(get("/user/1"))

               .andExpect(model().attributeExists("user"));

 

 

 

只要记住测试步骤,按照步骤操作,整个测试过程是非常容易理解的:

1、准备测试环境

2、通过MockMvc执行请求

3.1、添加验证断言

3.2、添加结果处理器

3.3、得到MvcResult进行自定义断言/进行下一步的异步请求

4、卸载测试环境

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值