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 测试技术 容器
Springboot+mockito进行单元测试心得整体
## SpringBoot应用测试 测试Springboot应用需要依赖一个非常重要的注解@SpringBootTest,这个注解会为测试用例构建Spring容器。@SpringBootTest注解修饰的测试用例默认不会启动web容器,如果需要启动web容器需要设置webEnvironment属性: * MOCK(默认):会启动一个mock的web server,可以配合@AutoConfig
6292 0
|
7月前
|
设计模式 Java Spring
Spring Boot使用责任链模式优化业务逻辑中的if-else代码
在开发过程中,我们经常会遇到需要根据不同的条件执行不同的逻辑的情况。传统的做法是使用if-else语句来进行条件判断,但是随着业务逻辑的复杂化,if-else语句会变得越来越臃肿,难以维护和扩展。这时候,我们可以考虑使用责任链模式来优化代码结构,使得代码更加清晰、可扩展和易于维护。
|
3月前
|
前端开发 Java 应用服务中间件
SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。 M: Model,模型层,指工程中的JavaBean,作用是处理数据。 JavaBean分为两类: 1.实体类Bean:专门存储业务数据的,如Student User等 2.业务处理Bean:指Service或Dao对象,专门用于处理业务逻辑和数据访问。
|
8月前
|
JSON 前端开发 Java
Spring Boot之Controller控制器:实现Web请求处理与业务逻辑分离
本篇详细介绍了Spring Boot中的Controller控制器的作用、用法和最佳实践。Controller是负责处理Web请求和响应的核心组件,能够将前端的HTTP请求映射到相应的业务逻辑处理,并返回适当的响应。通过一个简单的示例,展示了如何创建和配置Controller,并使用不同类型的注解来映射请求。还介绍了如何处理请求参数、路径变量,并展示了Controller方法返回不同类型的数据和视图的方式。通过学习本文内容,读者可以更好地理解和使用Spring Boot中的Controller,从而构建出灵活、高效的Web应用,提供优质的用户体验。
427 1
|
Java Spring
Spring boot 封装的http调用工具 RestTemplate 代码简洁好用
经常会调用一些接口,需要自己写httpclient,后面会把java自带的调用例子补上。后来发现spring封装好了一工具比较实用,这里备忘一下,方便后面查阅和使用。后面还会更新一些新的内容。
603 0
|
JSON Java 测试技术
SpringBoot对Controller进行单元测试【含乱码解决】(详细代码)
SpringBoot对Controller进行单元测试【含乱码解决】(详细代码)
SpringBoot对Controller进行单元测试【含乱码解决】(详细代码)
|
SQL Java 数据库连接
Spring【DAO模块】知识要点(一)
上一篇Spring博文主要讲解了如何使用Spring来实现AOP编程,本博文主要讲解Spring的DAO模块对JDBC的支持,以及Spring对事务的控制…
312 0
Spring【DAO模块】知识要点(一)
|
XML Java 数据库连接
Spring【DAO模块】知识要点(二)
上一篇Spring博文主要讲解了如何使用Spring来实现AOP编程,本博文主要讲解Spring的DAO模块对JDBC的支持,以及Spring对事务的控制…
174 0
Spring【DAO模块】知识要点(二)
|
前端开发 Java 应用服务中间件
SpringMvc:spring中的请求处理过程原理分析
SpringMvc:spring中的请求处理过程原理分析
SpringMvc:spring中的请求处理过程原理分析