您的位置:首页 > 理论基础 > 计算机网络

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条件判断要好的多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息