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

  • 相关阅读:
    web.xml配置详解(转载)
    http协议无状态中的 "状态" 到底指的是什么?!(转载)
    sublime配置python运行环境
    Eclipse下载安装教程
    局域网访问文件共享了访问不了解决方法
    ThreadLocal实现线程级上下文
    Spring中ApplicationEvent和ApplicationListener封装
    MySQL根据出生日期计算年龄的五种方法比较
    常用正则
    java.lang.OutOfMemoryError: PermGen space有效解决方法
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7277725.html
Copyright © 2020-2023  润新知