springMVC4(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层进行测试而无须依托服务器环境。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值