SpringBoot|SpringBoot 利用RestTemplate http测试

目录

  • SpringBoot RestTemplate http测试
    • spring-boot有关spring-boot测试的一些问题
    • 具体的测试方法如下
    • 但是有个问题就是
  • SpringBoot RestTemplate测试Controller
    • 1、功能测试类
    • 2、工具类

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 的问题

具体的测试方法如下
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)@EnableAutoConfigurationpublic class Test {@Autowiredpublic TestRestTemplate restTemplate; @org.junit.Testpublic void home(){String url="http://localhost:39900/migrate/test"; Map map=restTemplate.getForObject(url,Map.class); System.out.println(map.get("red")); }}

主函数如下
@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吗,现在是每次都变,只是随机的一个端口号,从这一面又能看出,其实测试不用单独启动主函数的,测试类会启动,访问不了是因为,端口号不对,但是至于怎么解决目前没有想到. 但是也不影响开发,因为我认为服务端都没启动,客户端怎么能访问呢。
【SpringBoot|SpringBoot 利用RestTemplate http测试】至于测试会加载springbootApplication但是端口不一样,没有执行加载端口类的结果。

SpringBoot RestTemplate测试Controller
1、功能测试类
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 normals = new ArrayList<>(); private static List 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() {@Overridepublic boolean hasError(ClientHttpResponse response) throws IOException {return true; }@Overridepublic 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 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 page = rest.getForObject(baseUrl, "", Page.class); Map params = new HashMap<>(); params.put("ids", "T0001,T0002"); //Page 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、工具类
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 * @return*/public static T postJSON(RestTemplate restTemplate, String url, Object param, Class responseType) {HttpEntity 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 makePostJSONEntiry(Object param) {HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); HttpEntity formEntity = new HttpEntity(JsonUtil.toJson(param), headers); log.info("rest-post-json-请求参数:{}", formEntity.toString()); return formEntity; }public static HttpEntity makePostTextEntiry(Map param) {HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); HttpEntity formEntity = new HttpEntity(makeGetParamContent(param), headers); log.info("rest-post-text-请求参数:{}", formEntity.toString()); return formEntity; }/*** 生成Get请求内容** @param param* @param excluedes* @return*/public static String makeGetParamContent(Map param, String... excluedes) {StringBuilder content = new StringBuilder(); List 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(); }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读