Springboot+Junit测试Http请求实例包括Get,Post,Put和Delete已及断言Assert的使用
2017-08-03 17:12
435 查看
今天测试Http接口的时候,发现一些问题,遇见Put和Delete请求时,使用TestRestTemplate无法获取返回值。先简单来说说两个测试的方法,第一个,使用Mock,但是个人认为它使用起来十分繁琐,不适合着急测试的人群,不亲民。第二个就是spring的TestRestTemplate,它实现的是RestOperations接口,里面有好多方法,即get,post,put,delete。但是唯一的缺陷就是直接使用其里面的put和delete方法并没有返回值,这让我们无法用断言测试了。先看看里面的方法。Get请求对应的是getForObject(String
url, Class<T> responseType, Object... uriVariables),它直接接受一个具体的URL,以及返回的类型,接受一个Class类型的泛型,也就是XXX.class,例如:
private RestTemplate template = new TestRestTemplate();
/**
* @category 通过主数据的标准化编码进行查询
* @author PQF
*/
@SuppressWarnings("unchecked")
@Test
public void testMasterDataControllerQueryMasterDataByCode(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata/0501080060000116";
ArrayList<String> result = template.getForObject(url, ArrayList.class);
Assert.assertTrue("通过主数据的标准化编码进行查询=>测试失败", result.size()>0);
System.err.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
至此就满足我们的需求了,是不是很简单。再说说Post请求,和Get一样,只不过名字变了,叫postForObject(String url, Object request, Class<T> responseType, Object... uriVariables),第一个参数是具体的URL,第二个是传入的对象或者其他要更改的数据,例如:
@Test
public void testMasterDataControllerCreateMasterData(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata";
TBasicMasterData tBasicMasterData = new TBasicMasterData();
tBasicMasterData.setCategory("100");
tBasicMasterData.setCode("100");
tBasicMasterData.setEnglishname("100");
tBasicMasterData.setFullname("100");
tBasicMasterData.setName("100");
tBasicMasterData.setOrdernumber("100");
tBasicMasterData.setUsage("100");
int forObject = template.postForObject(url, tBasicMasterData, Integer.class);
Assert.assertNotNull("创建一条主数据记录失败", forObject);
Assert.assertTrue("创建一条主数据记录=>测试失败", forObject>0);
System.err.println(forObject);
} catch (Exception e) {
e.printStackTrace();
}
}
是不是也很简单,。下面要说下Put和Delete请求看代码:
/**
* @category 更改一条主数据记录
* @author PQF
*/
@Test
public void testMasterDataControllerUpdateMasterData(){
try {
String reqJsonStr = "{\"category\":200,\"code\":\"200\", \"englishname\":\"200\",\"name\":\"200\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);
String url = "http://localhost:"+8081+"/v1/masterdata/100";
ResponseEntity<String> exchange = template.exchange(url, HttpMethod.PUT, entity, String.class);
String body = exchange.getBody();
Assert.assertNotNull("更改一条主数据记录失败", body);
Assert.assertTrue("更改一条主数据记录=>测试失败", Integer.valueOf(body)>0);
System.err.println(exchange);
} catch (Exception e) {
e.printStackTrace();
}
}
Put和Delete请求时,我们都需要调用exchange方法,第二个参数HttpMethod去指定到底是哪种请求,当使用Postman工具时,它是以json形式请求,所以要定义Header,不然会报错,说是不支持这种MediaType。ResponseEntity下面的getBody()获取当前返回值,什么意思呢??就是你service层定义的返回值是啥,它就返回啥。
如果Put弄明白了,那么Delete请求就太简单了,看代码:
/**
* @category 删除一条主数据记录
* @author PQF
*/
@Test
public void testMasterDataControllerDeleteMasterData(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata/200";
ResponseEntity<String> exchange = template.exchange(url, HttpMethod.DELETE, null, String.class);
String body = exchange.getBody();
Assert.assertNotNull("删除一条主数据记录失败", body);
Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);
System.err.println(exchange);
} catch (Exception e) {
e.printStackTrace();
}
}
是不是很简单???以上均是使用Junit4,所以测试的方法名称无需加test 也可行,但要使用@Test注解,表明这是你要测试的方法,至于其他的一些注解我就不多说了,网上资料太多了。
下面说说断言吧。Assert源码里面的方法均是由static修饰,什么意思呢?就是说你完全可以直接写assertTrue(),而不用Assert.assertTrue()。里面大约11种方法,似乎都是大同小异,真正实用的没几个,再去掉重载的,也就是名称重复的,似乎没啥了。但是它写的确实逆向的,什么意思呢?看下源码:
static public void assertTrue(String message, boolean condition) {
if (!condition) {
fail(message);
}
}
再拿我写的举例:
Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);
当条件为false的时候才会触发自定义的返回信息,为true的时候就啥也不管了。当我们把它用在程序里的时候,会直接抛异常,程序不会再往下走了。有人说,程序中太多的使用断言并非好事,但我个人仍然坚持,断言毕竟比一大堆的if else条件判断要好的多。
url, Class<T> responseType, Object... uriVariables),它直接接受一个具体的URL,以及返回的类型,接受一个Class类型的泛型,也就是XXX.class,例如:
private RestTemplate template = new TestRestTemplate();
/**
* @category 通过主数据的标准化编码进行查询
* @author PQF
*/
@SuppressWarnings("unchecked")
@Test
public void testMasterDataControllerQueryMasterDataByCode(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata/0501080060000116";
ArrayList<String> result = template.getForObject(url, ArrayList.class);
Assert.assertTrue("通过主数据的标准化编码进行查询=>测试失败", result.size()>0);
System.err.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
至此就满足我们的需求了,是不是很简单。再说说Post请求,和Get一样,只不过名字变了,叫postForObject(String url, Object request, Class<T> responseType, Object... uriVariables),第一个参数是具体的URL,第二个是传入的对象或者其他要更改的数据,例如:
@Test
public void testMasterDataControllerCreateMasterData(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata";
TBasicMasterData tBasicMasterData = new TBasicMasterData();
tBasicMasterData.setCategory("100");
tBasicMasterData.setCode("100");
tBasicMasterData.setEnglishname("100");
tBasicMasterData.setFullname("100");
tBasicMasterData.setName("100");
tBasicMasterData.setOrdernumber("100");
tBasicMasterData.setUsage("100");
int forObject = template.postForObject(url, tBasicMasterData, Integer.class);
Assert.assertNotNull("创建一条主数据记录失败", forObject);
Assert.assertTrue("创建一条主数据记录=>测试失败", forObject>0);
System.err.println(forObject);
} catch (Exception e) {
e.printStackTrace();
}
}
是不是也很简单,。下面要说下Put和Delete请求看代码:
/**
* @category 更改一条主数据记录
* @author PQF
*/
@Test
public void testMasterDataControllerUpdateMasterData(){
try {
String reqJsonStr = "{\"category\":200,\"code\":\"200\", \"englishname\":\"200\",\"name\":\"200\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);
String url = "http://localhost:"+8081+"/v1/masterdata/100";
ResponseEntity<String> exchange = template.exchange(url, HttpMethod.PUT, entity, String.class);
String body = exchange.getBody();
Assert.assertNotNull("更改一条主数据记录失败", body);
Assert.assertTrue("更改一条主数据记录=>测试失败", Integer.valueOf(body)>0);
System.err.println(exchange);
} catch (Exception e) {
e.printStackTrace();
}
}
Put和Delete请求时,我们都需要调用exchange方法,第二个参数HttpMethod去指定到底是哪种请求,当使用Postman工具时,它是以json形式请求,所以要定义Header,不然会报错,说是不支持这种MediaType。ResponseEntity下面的getBody()获取当前返回值,什么意思呢??就是你service层定义的返回值是啥,它就返回啥。
如果Put弄明白了,那么Delete请求就太简单了,看代码:
/**
* @category 删除一条主数据记录
* @author PQF
*/
@Test
public void testMasterDataControllerDeleteMasterData(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata/200";
ResponseEntity<String> exchange = template.exchange(url, HttpMethod.DELETE, null, String.class);
String body = exchange.getBody();
Assert.assertNotNull("删除一条主数据记录失败", body);
Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);
System.err.println(exchange);
} catch (Exception e) {
e.printStackTrace();
}
}
是不是很简单???以上均是使用Junit4,所以测试的方法名称无需加test 也可行,但要使用@Test注解,表明这是你要测试的方法,至于其他的一些注解我就不多说了,网上资料太多了。
下面说说断言吧。Assert源码里面的方法均是由static修饰,什么意思呢?就是说你完全可以直接写assertTrue(),而不用Assert.assertTrue()。里面大约11种方法,似乎都是大同小异,真正实用的没几个,再去掉重载的,也就是名称重复的,似乎没啥了。但是它写的确实逆向的,什么意思呢?看下源码:
static public void assertTrue(String message, boolean condition) {
if (!condition) {
fail(message);
}
}
再拿我写的举例:
Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);
当条件为false的时候才会触发自定义的返回信息,为true的时候就啥也不管了。当我们把它用在程序里的时候,会直接抛异常,程序不会再往下走了。有人说,程序中太多的使用断言并非好事,但我个人仍然坚持,断言毕竟比一大堆的if else条件判断要好的多。
相关文章推荐
- HTTP请求,包括OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT介绍
- PHP中使用CURL模拟发送GET,POST,PUT,DELETE请求
- get,post,delete,put的http请求。
- http请求方法(GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT)
- 使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
- HTTP请求:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE
- java发送http请求时设置请求方式(post,put,delete,get)
- springboot整合springSecurity出现的问题,post,delete,put无法使用
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
- ASIHTTPRequest中的DELETE、PUT、GET、POST请求实例-备用
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
- REST应该放弃使用http头GET、POST、PUT和DELETE来表达操作
- 使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
- python通过get方式,post方式,delete,put发送http请求和接收http响应
- 一个封装的使用Apache HttpClient进行Http请求(GET、POST、PUT等)的类。
- http请求方法(GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT)
- boke练习: springboot整合springSecurity出现的问题,post,delete,put无法使用
- REST模式中HTTP请求方法(GET,POST,PUT,DELETE)
- http请求方法(GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT)
- Angular HttpClient http请求示例(GET、PUT、 PATCH、POST、DELETE)