在前面我们进行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. (五)cobbler自定义系统安装

    注意:需要提前获取到物理机对应的网卡的MAC地址,例如我这里使用虚拟机进行演示 cobbler system add --name=linux-node2.com --mac=00:50:56:22: ...

  2. docker 与 yarn

    有时我们的项目是使用yarn去发布的,当需要使用docker发布这个项目时,安装yarn是必须的,但是平时使用的npm install -g yarn此时却不可用 从网站上找到解决的方法 地址:htt ...

  3. opencv图像的旋转

    #include"stdafx.h"#include"opencv2/opencv.hpp" using namespace cv;// clockwise 为 ...

  4. 使用 Hibernate 完成 HibernateUtils 类 (适用于单独使用Hibernate或Struts+Hibernate)

    package com.istc.Utilities; import org.hibernate.Session; import org.hibernate.SessionFactory; impor ...

  5. HDU 2280 Tetris Comes Back

    状态压缩,$dp$,预处理. 设$dp[i][j]$为前$i-1$行填满,第$i$行为状态$j$的最小需要$1$种类的数量.预处理好每种状态能推出哪些状态,并且记录下所需花费就可以了. #pragma ...

  6. Codeforces #439 Div2 E

    #439 Div2 E 题意 给出二维平面,有多个询问: 把某一区域围起来(围墙之间无交点) 移除某一区域的围墙(此时保证围墙一定存在) 选定两个位置问是否可以互相到达 分析 看起来很复杂,其实这道题 ...

  7. 【动态规划】bzoj1613 [Usaco2007 Jan]Running贝茜的晨练计划

    #include<cstdio> #include<algorithm> using namespace std; #define N 10001 int n,m,a[N],f ...

  8. 编译boost到各个系统平台 mac,iOS,linux,android,wind

    编译boost到各个系统平台 mac,iOS,linux,android,wind git地址:https://github.com/czjone/boost git仓库:https://github ...

  9. NSPredicate 谓词总结 数组过滤 模糊匹配

    NSPredicate 用于指定过滤条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配. NSPredicate常用方法介绍 1.创建NSPredicate(相当于创建一个过滤条件 ...

  10. 解决Visual Studio 2013 XAML设计器异常

    今天使用Visual Studio 2013打开一个windows 应用商店程序的时候,发现出现如下异常:    at System.Windows.Input.Cursor.LoadFromFile ...