springMVC4(5)RestTemplate控制层单元测试

简介: <div class="markdown_views"><p>在前面我们进行web测试,总要在游览器进行,数据组装、请求方法更给等都极为麻烦。 <br>RestTemplate是Spring提供的一个web层测试模板类,我们可以通过RestTemplate在客户端方便的进行web层功能测试。它支持REST风格的URL,而且具有AnnotationMethodHandlerA

在前面我们进行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层进行测试而无须依托服务器环境。

目录
相关文章
|
Java 测试技术 Spring
springMVC4(6)Unitils断言与整合测试
<div class="markdown_views"> <h1 id="反射断言">反射断言</h1> <h2 id="反射对象断言">反射对象断言</h2> <p>在实际场景中,我们比较两个对象是否相等,可能会去选择重写equals方法去比较对象里的每一个属性,或者是直接将对象的属性一个个取出来比较,但这都比较麻烦,Unitils为我们提供了反射断言可直接完成这一任
2414 0
|
4天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
30 11
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
60 3
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
76 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
262 7
Jmeter实现WebSocket协议的接口测试方法
|
3月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
272 3
快速上手|HTTP 接口功能自动化测试
|
3月前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
57 5
|
2月前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
44 0
|
4月前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~
|
5月前
|
存储
Postman 接口测试配置 Pre-request Script
Postman 接口测试配置 Pre-request Script
234 5
Postman 接口测试配置 Pre-request Script
下一篇
DataWorks