一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot 利用RestTemplate http測試

SpringBoot 利用RestTemplate http測試

2021-11-24 13:24AdesKng Java教程

這篇文章主要介紹了SpringBoot 利用RestTemplate http測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot RestTemplate http測試

spring-boot有關spring-boot測試的一些問題

這測試的時候主程序沒有啟動報錯。錯誤如下

==org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:39900/migrate/test": Connect to localhost:39900 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect; nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:39900 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect

at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:666)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)==

這是因為測試的類寫了url 的問題

具體的測試方法如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package api;
import com.hera.WebApplication;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = WebApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@EnableAutoConfiguration
public class Test {
    @Autowired
    public TestRestTemplate restTemplate;
    @org.junit.Test
    public void home(){
        String url="http://localhost:39900/migrate/test";
      Map map=restTemplate.getForObject(url,Map.class);
        System.out.println(map.get("red"));
    }
}

主函數如下

?
1
2
3
4
5
6
7
8
@ComponentScan(basePackages={"com.hera"})
@SpringBootApplication
@EnableJpaRepositories(repositoryFactoryBeanClass = ExtJpaRepositoryFactoryBean.class)
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

這樣可以認為是服務沒有啟動的原因,確實,當服務啟動的時候,這個錯誤就會沒有,這時候可以得出一個結論,就是Test的時候主函數是沒有啟動。需要啟動主函數參能測試,

但是有個問題就是

當測試時url不要http://localhost:39900沒有起動主函數一樣能成功

[INFO][2018-04-29T22:40:02.455+0800][BusinessHandlerInterceptor.java:28] 【LOG HANDLER】 url=http://localhost:63857/migrate/test, traceId=null
..............................
[INFO][2018-04-29T22:40:02.976+0800][BusinessHandlerInterceptor.java:48] 請求參數==> url: http://localhost:63857/migrate/test, spend:0.521秒, contentType: null, params: null, body_params: {}
green

但是端口號不是配置中的那個,還有就是每次端口號都會不一樣,真的很奇怪;根本不按照配置來的,我覺得就是它沒有都配置,但是默認端口不是8080嗎,現在是每次都變,只是隨機的一個端口號,從這一面又能看出,其實測試不用單獨啟動主函數的,測試類會啟動,訪問不了是因為,端口號不對,但是至于怎么解決目前沒有想到. 但是也不影響開發,因為我認為服務端都沒啟動,客戶端怎么能訪問呢。

至于測試會加載springbootApplication但是端口不一樣,沒有執行加載端口類的結果。

SpringBoot RestTemplate測試Controller

1、功能測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.imooc.controller;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.Assert;
import org.springframework.web.client.ResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import com.imooc.entity.Product;
import com.imooc.entity.enums.ProductStatus;
import com.imooc.util.RestUtil;
 
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING) // case執行順序
public class ProductControllerTest {
// @Autowired
// private TestRestTemplate rest;
 private static RestTemplate rest = new RestTemplate();
 @Value("http://localhost:${local.server.port}/products")
 private String baseUrl;
 // 正常數據
 private static List<Product> normals = new ArrayList<>();
 private static List<Product> exceptions = new ArrayList<>();
 @Before
 public void init(){ 
  Product p1 = new Product("T0001", "零活寶1號", ProductStatus.AUDITING.getCode(),
    BigDecimal.valueOf(10), BigDecimal.valueOf(1), 7,
    BigDecimal.valueOf(3.42), "memo", new Date(), new Date(), "zemel", "zemel");
  Product p2 = new Product("T0002", "零活寶2號", ProductStatus.AUDITING.getCode(),
    BigDecimal.valueOf(10), BigDecimal.valueOf(0), 6,
    BigDecimal.valueOf(3.42), "memo", new Date(), new Date(), "zemel", "zemel");
  Product p3 = new Product("T0003", "零活寶3號", ProductStatus.AUDITING.getCode(),
    BigDecimal.valueOf(100), BigDecimal.valueOf(10),3,
    BigDecimal.valueOf(3.42), "memo", new Date(), new Date(), "zemel", "zemel");
  normals.add(p1);
  normals.add(p2);
  normals.add(p3); 
  Product e1 = new Product(null, "零活寶1號", ProductStatus.AUDITING.getCode(),
    BigDecimal.valueOf(10), BigDecimal.valueOf(1), 7,
    BigDecimal.valueOf(3.42), "memo", new Date(), new Date(), "zemel", "zemel");
  exceptions.add(e1); 
  // 異常處理對象
  ResponseErrorHandler errorHandler = new ResponseErrorHandler() {  
   @Override
   public boolean hasError(ClientHttpResponse response) throws IOException {   
    return true;
   }  
   @Override
   public void handleError(ClientHttpResponse response) throws IOException {
    // TODO Auto-generated method stub   
   }
  };
  rest.setErrorHandler(errorHandler);
 }
 @Test
 public void testAddProduct() {
  normals.forEach(product -> {
   Product result = RestUtil.postJSON(rest, baseUrl, product, Product.class);
   Assert.notNull(result.getCreateAt(), "插入失敗");
  });
 }
 @Test
 public void testAddProductException() {
  exceptions.forEach(product -> {
   Map<String, String> result = RestUtil.postJSON(rest, baseUrl, product, HashMap.class);
//   Assert.notNull(result.getCreateAt(), "插入失敗");
   System.out.println(result);
   Assert.notNull(result.get("message").equals(product.getName()), "插入成功");
  });
 
 @Test
 public void testFindOne() {
  normals.forEach(p->{  
   Product result = rest.getForObject(baseUrl+"/"+p.getId(), Product.class);
   Assert.isTrue(result.getId().equals(p.getId()));
  }); 
  exceptions.forEach(p->{
   Product result = rest.getForObject(baseUrl+"/"+p.getId(), Product.class);
   Assert.isNull(result, "查詢失敗");    
  });
 }
 @Test
 public void testQuery() { 
//  Page<Product> page = rest.getForObject(baseUrl, "", Page.class); 
  Map<String, Object> params = new HashMap<>();
  params.put("ids", "T0001,T0002");
//  Page<Product> page = RestUtil.postJSON(rest, baseUrl, params, Page.class); 
  Map page = rest.getForObject(baseUrl, HashMap.class, params);
  System.out.println(page);
  System.out.println(page.get("pageable"));
  System.out.println(page.get("content"));
  Assert.notNull(page);
 }
}

2、工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.imooc.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.util.Arrays;
import java.util.List;
import java.util.Map; 
public class RestUtil {
    static Logger log = LoggerFactory.getLogger(RestUtil.class);
    /**
     * 發送post 請求
     *
     * @param restTemplate
     * @param url
     * @param param
     * @param responseType
     * @param <T>
     * @return
     */
    public static <T> T postJSON(RestTemplate restTemplate, String url, Object param, Class<T> responseType) {
        HttpEntity<String> formEntity = makePostJSONEntiry(param);
        T result = restTemplate.postForObject(url, formEntity, responseType);
        log.info("rest-post-json 響應信息:{}", JsonUtil.toJson(result));
        return result;
    }
    /**
     * 生成json形式的請求頭
     *
     * @param param
     * @return
     */
    public static HttpEntity<String> makePostJSONEntiry(Object param) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);
        HttpEntity<String> formEntity = new HttpEntity<String>(
                JsonUtil.toJson(param), headers);
        log.info("rest-post-json-請求參數:{}", formEntity.toString());
        return formEntity;
    
    public static HttpEntity<String> makePostTextEntiry(Map<String, ? extends Object> param) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);
        HttpEntity<String> formEntity = new HttpEntity<String>(
                makeGetParamContent(param), headers);
        log.info("rest-post-text-請求參數:{}", formEntity.toString());
        return formEntity;
    
    /**
     * 生成Get請求內容
     *
     * @param param
     * @param excluedes
     * @return
     */
    public static String makeGetParamContent(Map<String, ? extends Object> param, String... excluedes) {
        StringBuilder content = new StringBuilder();
        List<String> excludeKeys = Arrays.asList(excluedes);
        param.forEach((key, v) -> {
            content.append(key).append("=").append(v).append("&");
        });
        if (content.length() > 0) {
            content.deleteCharAt(content.length() - 1);
        }
        return content.toString();
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/AdesKng/article/details/80204521

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 欧美老女人b | 插入影院 | 夫妻性生活免费在线观看 | 日本老头4569gay | 美妇在线 | 午夜国产精品视频在线 | 香蕉在线精品亚洲第一区 | 国产成人v爽在线免播放观看 | 亚洲精品久久7777777 | 欧美成人另类人妖 | 四虎影院2022 | 欧美日韩在线一区 | 亚洲第一网站免费视频 | 嫩草蜜桃| 久久这里都是精品 | 国产欧美日韩图片一区二区 | 男人的天堂视频 | 国产成人黄网在线免 | 亚洲国产精品久久精品怡红院 | 红楼影视h38bar在线线播放 | ass天天裸妇pics | 色综合久久丁香婷婷 | 婷婷影院在线观看 | 免费91麻豆精品国产自产在线观看 | 无码人妻少妇色欲AV一区二区 | 亚洲天堂影院 | 人人揉人人爽五月天视频 | 偷拍综合网 | 按摩椅play啊太快了h | 国产成人精品免费视频大全五级 | 成人影院在线看 | 亚洲高清视频在线 | 热久久最新视频 | 国产第7页 | 香蕉草莓视频 | 99精品久久久久久 | 日产免费自线一二区 | 亚洲乱亚洲23p女 | 操bb视频 | 息与子中文字幕在线 | piss美女厕所小便 |