好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

查看更多关于SpringBoot 利用RestTemplate http测试的详细内容...

  阅读:19次