今天测试Http接口的时候,发现一些问题,遇见Put和Delete请求时,使用TestRestTemplate无法获取返回值。先简单来说说两个测试的方法,第一个,使用Mock,但是个人认为它使用起来十分繁琐,不适合着急测试的人群,不亲民。第二个就是spring的TestRestTemplate,它实现的是RestOperations接口,里面有好多方法,即get,post,put,delete。但是唯一的缺陷就是直接使用其里面的put和delete方法并没有返回值,这让我们无法用断言测试了。先看看里面的方法。Get请求对应的是getForObject(String url, 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 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
@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 entity = new HttpEntity(reqJsonStr,headers);
String url = "http://localhost:"+8081+"/v1/masterdata/100";
ResponseEntity 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请求就太简单了,看代码:
/**
* @category 删除一条主数据记录
* @author PQF
*/
@Test
public void testMasterDataControllerDeleteMasterData(){
try {
String url = "http://localhost:"+8081+"/v1/masterdata/200";
ResponseEntity 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();
}
}
下面说说断言吧。Assert源码里面的方法均是由static修饰,什么意思呢?就是说你完全可以直接写assertTrue(),而不用Assert.assertTrue()。里面大约11种方法,似乎都是大同小异,真正实用的没几个,再去掉重载的,也就是名称重复的,似乎没啥了。但是它写的确实逆向的,什么意思呢?看下源码:
static public void assertTrue(String message, boolean condition) {
if (!condition) {
fail(message);
}
}
Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);