springMVC4(5)RestTemplate控制层单元測试
在前面我们进行web測试,总要在游览器进行。数据组装、请求方法更给等都极为麻烦。
RestTemplate是Spring提供的一个web层測试模板类,我们能够通过RestTemplate在client方便的进行web层功能測试。它支持REST风格的URL,并且具有AnnotationMethodHandlerAdapter的数据转换器HttpMessageConverters的装配功能。
RestTemplate已默认帮我们完毕了一下数据转换器的注冊:
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- ResourceHttpMessageConverter
- SourceHttpMessageConverter
- XmlAwareFormHttpMessageConverter
在默认情况下。我们能够直接利用以上转换器对响应数据进行转换处理。
而假设我们像拓展其它的转换器如Jaxb2RootElementHttpMessageConverter或MappingJacksonHttpMessageConverter。我们能够使用setMessageConverters(List<HttpMessageConverter<?>> messageConverters)
来注冊我们所需的转换器。
使用RestTemplate能为我们构建restful风格的client请求模板,提供post、get、put、delete、head、options、trace等请求方法,在这里,我们主要分析使用post和get方法来模拟我们web请求,它的优势在于能够通过编程组装解析我们的web请求和响应数据,同一时候还能方便的改动请求头信息。
在上一篇文章《springMVC(4)json与对象互转实例解析请求响应数据转换器 》我们意图測试发送json格式字符串使后端格式化json字符串并转化为对应的json对象。当中要求contentType必须为application/json。
假设这一请求我们直接从游览器输入,会导致出现NetworkError: 415 Unsupported Media Type错误。
而使用RestTemplate能解决问题并方便的完毕我们的web測试。
再以我们上一篇的控制器为例:
@RequestMapping("getUser")
public void getUser( @RequestBody User user){//将输入数据转化为User对象
System.out.println(user);
}
@ResponseBody//将输出的java对象转换为合适的对应正文输出
@RequestMapping("getUser2")
public User getUser2(User user){
System.out.println(user);
return user;
}
第一个请求要求输入json格式字符串。spring自己主动将其转换为User对象,第二个方法要求以键值对形式输入User成员属性,然后直接返回User对象,交由spring转换为json字符串输出。
以下来看我们怎样使用RestTemplate来请求getUser方法:
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
public static void main(String args[]){
String user = "{\"id\":10,\"password\":\"myPassword\",\"userName\":\"myUserName\"}";//实例请求參数
HttpHeaders headers = new HttpHeaders();//创建一个头部对象
//设置contentType
headers.setContentType(MediaType.valueOf("application/json;UTF-8"));
//设置我们的请求信息,第一个參数为请求Body,第二个參数为请求头信息
//完整的方法签名为:HttpEntity<String>(String body, MultiValueMap<String, String> headers)
HttpEntity<String> strEntity = new HttpEntity<String>(user,headers);
RestTemplate restTemplate = new RestTemplate();
//使用post方法提交请求,第一參数为url,第二个參数为我们的请求信息,第三个參数为我们的对应放回数据类型。与String result对厅
//完整的方法签名为:postForObject(String url, Object request, Class<String> responseType, Object... uriVariables) ,最后的uriVariables用来拓展我们的请求參数内容。
String result = restTemplate.postForObject("http://localhost:8080/springMVC/user/getUser1",strEntity,String.class);
System.out.println(result);//执行方法,这里输出:
//User [id=10, userName=myUserName, password=myPassword]
}
上面我们使用post方法完毕请求,假设我们要使用get方法的话能够使用下列方法
getForObject(String url, Class<T> responseType, Object... urlVariables)
我们在url中使用占位符,然后在urlVariables中注入,使用Object…按次序注入,假设我们想要按名称注入。能够使用例如以下重载方法:
getForObject(String url, Class<T> responseType, Map urlVariables)
上面实例我们完毕了以application/json的媒体格式、以json字符串为參数请求server,并在后端完毕json->java对象的解析。以下我们再看一个发送普通表单參数的的样例:
RestTemplate restTemplate = new RestTemplate();
//使用占位符绑定入參,这里使用了按顺序注入,所以占位符的參数名随意
//假设使用map注入,则占位符名称需与map中key对应。
String result = restTemplate.postForObject("http://localhost:8080/springMVC/user/getUser2?
id={1}&password={2}&userName={3}"
,uEntity,String.class,10,"myPassword","myUserName");
System.out.println(result);//输出{"id":10,"userName":"myUserName","password":"myPassword"}
由于RestTemplate默认装配了前面提到的5个数据转换器。假设我们希望RestTemplate帮我们将上例的json字符串自己主动转为User对象。也是非常轻松的,看以下演示样例:
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> result = restTemplate.postForEntity("http://localhost:8080/springMVC/user/getUser2?id={1}&password={2}&userName={3}"
,null,User.class,10,"myPassword","myUserName");
System.out.println(result2.getBody());
我们仅需将String返回值改成User,并将我们的result的类型定义为ResponseEntity就可以,使用这样的方法。除了能够获取我们的响应正文Body,还能够获取到正文头信息Header。
在本篇本章中。我们使用RestTemplate完毕了client測试工作。但在标准的web开发中。我们不希望总是在改动后又一次部署server,然后再在client測试。
在下一篇文章中。将会引入Untils配合RestTemplate对我们的web层进行測试而无须依托server环境。
springMVC4(5)RestTemplate控制层单元測试的更多相关文章
- Android单元測试之JUnit
随着近期几年測试方面的工作慢慢火热起来.常常看见有招聘測试project师的招聘信息.在Java中有单元測试这么一个JUnit 方式,Android眼下主要编写的语言是Java,所以在Android开 ...
- 聊聊单元測试(一)——EasyMock
一.单元測试是保证软件质量的重要方法. 单元測试是对系统中某个模块功能的验证,但我们总会遇到这样那样的问题,导致測试代码非常难编写.最直接的一个原因便是强耦合关系,被測试者依赖一些不easy构造,比較 ...
- (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试
Android单元和instrumentation单元測试 Developing Android unit and instrumentation tests Android的单元測试是基于JUnit ...
- 单元測试中 Right-BICEP 和 CORRECT
My Blog:http://www.outflush.com/ 在单元測试中,有6个总结出的值得測试的方面,这6个方面统称为 Right-BICEP.通过这6个方面的指导.能够较全然的測试出代码中的 ...
- 利用Continuous Testing实现Eclipse环境自己主动单元測试
当你Eclipse环境中改动项目中的某个方法时,你可能因为各种原因没有执行单元測试,结果代码提交,悲剧就可能随之而来. 所幸infinitest(http://infinitest.github.io ...
- 在Eclipse中使用JUnit4进行单元測试(0基础篇)
本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...
- C语言单元測试
C语言单元測试 对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有 ...
- OpenStack中给wsgi程序写单元測试的方法
在 OpenStack 中, 针对web应用, 有三种方法来写单元測试 1) 使用webob生成模拟的request from __future__ import print_function imp ...
- 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...
随机推荐
- javaScript Promise 入门
Promise是JavaScript的异步编程模式,为繁重的异步回调带来了福音. 一直以来,JavaScript处理异步都是以callback的方式,假设需要进行一个异步队列,执行起来如下: anim ...
- 洛谷 P1570 KC喝咖啡【二分答案/最大化平均值模板】
题目描述 话说KC和SH在福州的时候常常跑去85°C喝咖啡或者其他的一些什么东西. 这天,KC想要喝一杯咖啡,服务员告诉他,现在有n种调料,这杯咖啡只可以加入其中的m种(当然KC一定会加入m种,不会加 ...
- HDU 6081 度度熊的王国战略【并查集/数据弱水题/正解最小割算法】
链接6081 度度熊的王国战略 Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 32768/132768 K (Java/Others) ...
- ASP.NET Core 2.2 基础知识(三) 静态文件
什么是静态文件? HTML,CSS,JS,图片等都叫做静态文件. 要想提供静态文件给客户端,需要注册静态文件中间件. 我们先分别添加一个 WebAPI 项目,一个 Razor 视图项目,比较两个项目的 ...
- [BZOJ2655]calc(拉格朗日插值法+DP)
2655: calc Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 428 Solved: 246[Submit][Status][Discuss] ...
- 【最小割】【Dinic】bzoj3275 Number
每个点拆点,分别向源/汇连a[i]的边,满足条件的相互连INF的边,答案为sum-maxflow*2. 因为若有几个点不能同时被选,我们要贪心地选择其中和尽量大的部分,这可以由最小割来保证. #inc ...
- 【最大流】【Dinic】bzoj2929 [Poi1999]洞穴攀行
TMD 题意其实是与1或n相连的边只能走一次,其他可以走无限次……翻译去死. 裸最大流. #include<cstdio> #include<cstring> #include ...
- 【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap
[题目大意] 对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. [思路] 前面的思路同HDU1695 不过不同的是这道题中(a,b)和(b ...
- 1.2(java学习笔记)类与对象
对象:是指具体的事物.比如学生 张三,老师 李四,代表一个单一的个体. 比如 学生 张三,这时张三就是具体的对象. 类:将对象中共有特征抽象出,可以理解为某种特性的集合. 世界上的事物可以分解成一 ...
- Java高级架构师(一)第28节:Index、商品详细页和购物车
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...