在前面我们进行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控制层单元測试的更多相关文章

  1. Android单元測试之JUnit

    随着近期几年測试方面的工作慢慢火热起来.常常看见有招聘測试project师的招聘信息.在Java中有单元測试这么一个JUnit 方式,Android眼下主要编写的语言是Java,所以在Android开 ...

  2. 聊聊单元測试(一)——EasyMock

    一.单元測试是保证软件质量的重要方法. 单元測试是对系统中某个模块功能的验证,但我们总会遇到这样那样的问题,导致測试代码非常难编写.最直接的一个原因便是强耦合关系,被測试者依赖一些不easy构造,比較 ...

  3. (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试

    Android单元和instrumentation单元測试 Developing Android unit and instrumentation tests Android的单元測试是基于JUnit ...

  4. 单元測试中 Right-BICEP 和 CORRECT

    My Blog:http://www.outflush.com/ 在单元測试中,有6个总结出的值得測试的方面,这6个方面统称为 Right-BICEP.通过这6个方面的指导.能够较全然的測试出代码中的 ...

  5. 利用Continuous Testing实现Eclipse环境自己主动单元測试

    当你Eclipse环境中改动项目中的某个方法时,你可能因为各种原因没有执行单元測试,结果代码提交,悲剧就可能随之而来. 所幸infinitest(http://infinitest.github.io ...

  6. 在Eclipse中使用JUnit4进行单元測试(0基础篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...

  7. C语言单元測试

    C语言单元測试 对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有 ...

  8. OpenStack中给wsgi程序写单元測试的方法

    在 OpenStack 中, 针对web应用, 有三种方法来写单元測试 1) 使用webob生成模拟的request from __future__ import print_function imp ...

  9. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例

    第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...

随机推荐

  1. AC日记——Is it rated? codeforces 807a

    Is it rated? 思路: 水题: 代码: #include <cstdio> #include <cstring> using namespace std; ],b[] ...

  2. CF 990B. Micro-World【数组操作/贪心/STL/二分搜索】

    [链接]:CF [题意]:对任意一个数a[i] ,可以对任意 满足 i != j 且 a[i] > a[j] && a[i] <= a[j] +k 的 a[j] 可以被删掉 ...

  3. 洛谷 P3927 SAC E#1 - 一道中档题 Factorial【数论//】

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  4. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  5. MapReduce 编程模板

    1.MapReduce 编程模型的5个步骤: 1)迭代,将输入数据解析成 key/value 对: 2)将解析的 key/value经过Map处理映射成另一组key/value对: 3)根据key进行 ...

  6. MYSQL从入门到放弃系列:mysql基础语法

    Mysql基本语法 启动MySQL net start mysql 连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码 跳过权限验证登录MySQL mysqld --ski ...

  7. hdu6156

    hdu6156 题意 求 \([2, 36]\) 进制下,给定区间内的数是回文数的个数.每存在一个回文数,答案加上该回文数的进制. 分析 10进制下回文数是 数位DP 很常见的问题,这道题只需要把在转 ...

  8. 微信小程序开发教程(九)视图层——.wxss详解

    WXSS是一套样式语言,用于描述WXML的组件样式. 官方文档表示,WXSS的选择器目前支持(“.class”.“#id”.“elemnt”.“element,element”.“::after”.“ ...

  9. [CTSC2017]游戏(Bayes定理,线段树)

    传送门:http://uoj.ac/problem/299 题目良心给了Bayes定理,但对于我这种数学渣来说并没有什么用. 先大概讲下相关数学内容: 1.定义:$P(X)$ 表示事件$X$发生的概率 ...

  10. 苹果iOS系统下检查第三方APP是否安装及跳转启动

    在iOS系统,使用Url Scheme框架在APP间互相跳转和传递数据,本文只介绍如果检测和跳转. Url Scheme框架 如果你想知道ios设备中是否安装QQ这个软件,我们可以通过一个简单方法判断 ...