今天测试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条件判断要好的多。
转载自:http://blog.csdn.net/u011550710/article/details/76638893