springMVC4(5)RestTemplate控制层单元测试
来源:互联网 发布:曹琴默 知乎 编辑:程序博客网 时间:2024/06/05 09:11
在前面我们进行web测试,总要在游览器进行,数据组装、请求方法更给等都极为麻烦。
RestTemplate是Spring提供的一个web层测试模板类,我们可以通过RestTemplate在客户端方便的进行web层功能测试。它支持REST风格的URL,而且具有AnnotationMethodHandlerAdapter的数据转换器HttpMessageConverters的装配功能。RestTemplate已默认帮我们完成了一下数据转换器的注册:
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- ResourceHttpMessageConverter
- SourceHttpMessageConverter
- XmlAwareFormHttpMessageConverter
在默认情况下,我们可以直接利用以上转换器对响应数据进行转换处理。而如果我们像拓展其他的转换器如Jaxb2RootElementHttpMessageConverter或MappingJacksonHttpMessageConverter。我们可以使用setMessageConverters(List<HttpMessageConverter<?>> messageConverters)
来注册我们所需的转换器。
使用RestTemplate能为我们构建restful风格的客户端请求模板,提供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字符串为参数请求服务器,并在后端完成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完成了客户端测试工作。但在标准的web开发中,我们不希望总是在修改后重新部署服务器,然后再在客户端测试。在下一篇文章中,将会引入Untils配合RestTemplate对我们的web层进行测试而无须依托服务器环境。
- springMVC4(5)RestTemplate控制层单元测试
- Controller 使用RestTemplate进行单元测试 spring mvc
- 利用Spring的mock对控制层进行单元测试
- springmvc4+Junit单元测试的几个重要点
- SpringMVC4.1之Controller层最佳实践
- SpringMVC4.1之Controller层实践
- (5) RestTemplate实战详解
- RestTemplate
- RestTemplate
- restTemplate
- RestTemplate
- RestTemplate
- springMVC4
- 5、图层控制TOC
- HttpClient4.5和RestTemplate使用
- 单元测试系列之5:使用unitils测试Service层
- 解决dao层单元测试问题
- IntelliJ IDEA 逻辑层单元测试
- POJ 1061-青蛙的约会(拓展欧几里得)
- C++智能指针与返回局部指针测试
- java基础知识点总结(三)
- iOS创建Framework
- linux——单网卡配置双(多)ip
- springMVC4(5)RestTemplate控制层单元测试
- [从头学数学] 第157节 概率初步 小结与复习题
- 超简单小算法求圆面积(测多组数据及小用一下正则表达式)(入门)
- ZOJ 1151 Word Reversal
- Linux SD卡驱动开发(三) —— SD 卡驱动分析CORE篇
- 多项式加法运算
- 考驾照 报名 科目一 科目二 科目三 科目四 视频
- CSP考试 2014年09月第2题 画图 C语言实现
- Android相对布局属性全解