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环境。

时间: 2024-08-09 11:26:41

springMVC4(5)RestTemplate控制层单元測试的相关文章

单元測试和白盒測试相关总结

一.  软件測试方法 1.        软件測试方法包含:白盒測试(White  Box  Testing).黑盒測试(Black  Box Testing).灰盒測试.静态測试.动态測试. 2.        白盒測试:是一种測试用例设计方法.在这里盒子指的是被測试的软件,白盒.顾名思义即盒子是可视的,你能够清晰盒子内部的东西以及里面是怎样运作的.因此白盒測试须要你对系统内部的结构和工作原理有一个清晰的了解,并且基于这个知识来设计你的用例. 白盒測试技术一般可被分为静态分析和动态分析两类技术

C语言单元測试

对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有这么几个工具: CuTest -- CuTest(Cute Test)是一个很easy的C语言单元測试工具.在使用它的时候,仅仅须要包括两个文件“CuTest.c CuTest.h”,然后就能够写測试用例,进行測试了.它对用例差点儿没有管理功能,报表输出也很easy,能够用来试验单元測试的基本想法. CUnit -

Android 进行单元測试难在哪-part3

原文链接 : HOW TO MAKE OUR ANDROID APPS UNIT TESTABLE (PT. 1) 原文作者 : Matthew Dupree 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: tiiime 状态 : 完毕 在 Android 应用中进行单元測试非常困难.有时候甚至是不可能的.在之前的两篇博文中,我已经向大家解释了在 Android 中进行单元測试如此困难的原因.而上一篇博文我们通过分析得到的结论是:正是 Google 官

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

当你Eclipse环境中改动项目中的某个方法时,你可能因为各种原因没有执行单元測试,结果代码提交,悲剧就可能随之而来. 所幸infinitest(http://infinitest.github.io/)提供了一个Continuous Testing插件,以及时自己主动执行单元測试.尽管会多占一些CPU资源,但开发者的硬件谁会不留一点余地呢?大不了,音乐.视频.360卸载就OK了.安装方法有两种: (1)使用"Install new software",输入地址:http://infi

玩转单元測试之WireMock -- Web服务模拟器

WireMock 是一个灵活的库用于 Web 服务測试,和其它測试工具不同的是.WireMock 创建一个实际的 HTTPserver来执行你的 Web 服务以方便測试. 它支持 HTTP 响应存根.请求验证.代理/拦截.记录和回放. 而且能够在单元測试下使用或者部署到測试环境. 它能够用在哪些场景下: 測试移动应用依赖于第三方REST APIs 创建高速原型的APIs 注入否则难于模拟第三方服务中的错误 不论什么单元測试的代码依赖于web服务的 文件夹 前提条件 Maven配置 准备工作 Ex

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

本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能非常强大,但我们在程序中仅仅用到该函数的一小部分功能,而且经过调试能够确定,这一小部分功能是正确的.可是,我们同一时候应该确保每个函数都全然正确,由于假设我们今后假设对程序进行扩展,用到了某个函数的其它功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这

新手学測试----Unit Test(单元測试)

在程序猿做项目的过程中,每当完毕一个功能,首先自己须要对完毕的功能进行測试.我如今正在做的项目用的工具是VS2012.那么接下来,就说一说在VS2012中是怎样创建单元測试的. 怎样创建单元測试? 在VS2012中,右键类名默认是没有创建单元測试的选项的,得须要设置加入.工具-->自己定义: 然后选择命令-->上下文菜单-->编辑器上下文菜单|代码窗体.然后找到创建单元測试,并将其上下移动到下图所看到的位置: 然后又一次打开VS.在类名上右键就能够看到灰色的创建单元測试,处于禁用状态:

[iOS翻译]《iOS7 by Tutorials》在Xcode 5里使用单元測试(上)

简单介绍: 单元測试是软件开发的一个重要方面.毕竟,单元測试能够帮你找到bug和崩溃原因,而程序崩溃是Apple在审查时拒绝app上架的首要原因. 单元測试不是万能的,但Apple把它作为开发工具包的一部分,不仅让你创作的APP更稳定,并且提供了一致.有趣的用户体验,这些都是让用户给你五星评价的源泉.iOS7提供了一个升级的单元測试框架.让你在Xcode中执行单元測试更为easy.当你完毕这一章节,你将学会怎样给现有app加入測试--并有可能培养出对编写測试的热爱! /* 本文翻译自<iOS7

单元測试的优点

对于单元測试.我慢慢的用得多起来.前不久.还对这个东西朦朦胧胧,认为非常神奇. 如今,我认为单元測试真是极好的. 好在哪里呢?就是好来就是好! 靠,这又不是某D某主义,得讲理.怎么个好法,要说出理由. 好吧.我认为单元測试能够 1.保证代码质量 2.提高开发效率 比方说,这2天我与还有一位同事共同开发某模块.他搞前端,我写server端.他要调用我的方法. 开发是并行的,我在写方法的时候,他的界面还没好,那怎么确保我的方法正确呢?不可能等他写好界面,写好调用我方法的代码,然后我俩再一起測试吧?