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

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

时间: 2024-08-01 22:45:29

springMVC(5)RestTemplate控制层单元测试的相关文章

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

在前面我们进行web測试,总要在游览器进行.数据组装.请求方法更给等都极为麻烦. RestTemplate是Spring提供的一个web层測试模板类,我们能够通过RestTemplate在client方便的进行web层功能測试.它支持REST风格的URL,并且具有AnnotationMethodHandlerAdapter的数据转换器HttpMessageConverters的装配功能. RestTemplate已默认帮我们完毕了一下数据转换器的注冊: ByteArrayHttpMessageC

菜鸟学习Spring——SpringMVC注解版控制层重定向到控制层

一.概述. SpringMVC中界面请求Contorller1,Contorller1需要重定向到Contorller2中显示其他页面或者做一些业务逻辑,Spring中提供了这个功能利用"redirect:/"来进行重定向. 二.代码演示. 1.界面 Login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF

springmvc后台控制层获取参数的方法

在SpringMVC后台控制层获取参数的方式主要有两种, 一种是request.getParameter("name"), 另外一种是用注解@RequestParam直接获取.这里主要讲这个注解 一.基本使用,获取提交的参数 后端代码: Java代码   @RequestMapping("testRequestParam") public String filesUpload(@RequestParam String inputStr, HttpServletReq

控制层SpringMVC和Struts2的区别

我们现在流行的常用的MVC层,控制层Controller层的框架主要有Struts2和SpringMVC两个框架,分别对应着Action和Controller.那么SpringMVC和Struts的主要区别有那些呢? 一.框架机制 我们知道Struts2采用Filter实现,而SpringMVC则采用Servlet实现. Struts2使用StrutsPrepareAndExecuteFilter,而SpringMVC使用DispatcherServlet.Filter是一种特殊的Servlet

SpringBoot控制层实现单元测试

package com.springboot.demo.controller;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test

Spring MVC控制层的返回类型--String类型与Bean类型

SpringMVC控制层的返回类型形式多样,现拿其中的两种--String类型与Bean类型作以说明. 一.测试项目的结构 说明:(jsp的名字没起好) 控制层:UserController.java --对用户的相关操作: 视图层:toFormTest.jsp--跳转至formTest.jsp (这样跳转的原因:1.由于jsp文件夹在WEB-INF目录下,所以无法直接访问:2.在目标地址formTest.jsp中的表单采用了sf标签,需在控制层中初始化表单所绑定的bean对象,所以需先进入控制

Spring的四个基本注解annotation(控制层,业务层,持久层) @Component、@

SpringMVC中四个基本注解: @Component.@Repository   @Service.@Controller 看字面含义,很容易却别出其中三个: @Controller    控制层,就是我们的action层 @Service        业务逻辑层,就是我们的service或者manager层 @Repository  持久层,就是我们常说的DAO层 而@Component  (字面意思就是组件),它在你确定不了事哪一个层的时候使用. 其实,这四个注解的效果都是一样的,Sp

unity3D 实战 《小十传奇》系列之二:控制层(上)

大家好,我们今天来一起学习 小十传奇 的控制层. 操作步骤 为了结构美观,新建一个空节点,把Model,View,Ctrl都移动到Ten目录下面: 在assets目录下面新家Code文件夹,在COde下面新建Ctrl,View的C#脚本. 修改Ctrl.cs脚本 一个重要的名词:有限状态机    由游戏开发极客提供的工具包GDGeek包中包含. 有限状态机可以控制游戏的开始,游戏,结束状态的转换. 利用有限状态机添加三个状态.并且设置状态触发函数,代码如下: using UnityEngine;

angularjs控制层

在初学angular的时候,往往会在控制层中写很多代码,一切可在控制层写的会全部写在控制层 解决(God like)的方法 在控制层职责梳理: 1.负责UI相关的数据初始化 2.负责不同模块间的数据通信 3.负责UI交互的逻辑处理 基本行为的抽象 1.可以利用模板方法模式将常用的Controller初始化过程抽象为一系列标准的初始化方法.子类根据实际类型法做不同方法的复写 常用功能的封装 1.在原有的基础上做功能的封装 2.提供全局事件注册.销毁的快速接口 3.提供模型获取的快速接口等等 4.提