SpringBoot 利用RestTemplate http测试

网友投稿 280 2022-12-17

SpringBoot 利用RestTemplate http测试

目录SpringBoot RestTemplate http测试spring-boot有关spring-boot测试的一些问题具体的测试方法如下但是有个问题就是SpringBoot RestTemplate测试Controller1、功能测试类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)

@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"));

}

}

主函数如下

@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、功能测试类

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() {

@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 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 rehttp://sult = 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();

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用java实现猜数字游戏
下一篇:使用springboot整合websocket实现群聊教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~