Springboot的Junit测试以及Assert的使用【转载】

今天测试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,例如:

 

[java]  view plain  copy
 
  1.  private RestTemplate template = new TestRestTemplate();  
  2.    
  3.  /** 
  4.   * @category 通过主数据的标准化编码进行查询 
  5.   * @author PQF 
  6.   */  
  7.  @SuppressWarnings("unchecked")  
  8.  @Test  
  9.  public void testMasterDataControllerQueryMasterDataByCode(){  
  10.      try {  
  11.          String url = "http://localhost:"+8081+"/v1/masterdata/0501080060000116";       
  12.          ArrayList<String> result = template.getForObject(url, ArrayList.class);  
  13.          Assert.assertTrue("通过主数据的标准化编码进行查询=>测试失败", result.size()>0);  
  14.          System.err.println(result);  
  15.      } catch (Exception e) {  
  16. e.printStackTrace();  
  17.   
  18.  }  

 

至此就满足我们的需求了,是不是很简单。再说说Post请求,和Get一样,只不过名字变了,叫postForObject(String url, Object request, Class<T> responseType, Object... uriVariables),第一个参数是具体的URL,第二个是传入的对象或者其他要更改的数据,例如:

 

[java]  view plain  copy
 
  1.   @Test  
  2.   public void testMasterDataControllerCreateMasterData(){  
  3.      try {  
  4.          String url = "http://localhost:"+8081+"/v1/masterdata";  
  5.          TBasicMasterData tBasicMasterData = new TBasicMasterData();  
  6.          tBasicMasterData.setCategory("100");  
  7.          tBasicMasterData.setCode("100");  
  8.          tBasicMasterData.setEnglishname("100");  
  9.          tBasicMasterData.setFullname("100");  
  10.          tBasicMasterData.setName("100");  
  11.          tBasicMasterData.setOrdernumber("100");  
  12.          tBasicMasterData.setUsage("100");  
  13.          int forObject = template.postForObject(url, tBasicMasterData, Integer.class);  
  14.          Assert.assertNotNull("创建一条主数据记录失败", forObject);  
  15.          Assert.assertTrue("创建一条主数据记录=>测试失败", forObject>0);  
  16.          System.err.println(forObject);  
  17.      } catch (Exception e) {  
  18.     e.printStackTrace();  
  19. }  
  20.   }  

是不是也很简单,。下面要说下Put和Delete请求看代码:

 

[java]  view plain  copy
 
  1. /** 
  2.  * @category 更改一条主数据记录 
  3.  * @author PQF 
  4.  */  
  5.  @Test  
  6.  public void testMasterDataControllerUpdateMasterData(){  
  7.      try {  
  8.          String reqJsonStr = "{\"category\":200,\"code\":\"200\", \"englishname\":\"200\",\"name\":\"200\"}";  
  9.          HttpHeaders headers = new HttpHeaders();  
  10.          headers.setContentType(MediaType.APPLICATION_JSON);  
  11.          HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);  
  12.          String url = "http://localhost:"+8081+"/v1/masterdata/100";  
  13.          ResponseEntity<String> exchange = template.exchange(url, HttpMethod.PUT, entity, String.class);  
  14.          String body = exchange.getBody();  
  15.          Assert.assertNotNull("更改一条主数据记录失败", body);  
  16.          Assert.assertTrue("更改一条主数据记录=>测试失败", Integer.valueOf(body)>0);  
  17.          System.err.println(exchange);  
  18.      } catch (Exception e) {  
  19. e.printStackTrace();  
  20.   
  21.  }  


Put和Delete请求时,我们都需要调用exchange方法,第二个参数HttpMethod去指定到底是哪种请求,当使用Postman工具时,它是以json形式请求,所以要定义Header,不然会报错,说是不支持这种MediaType。ResponseEntity下面的getBody()获取当前返回值,什么意思呢??就是你service层定义的返回值是啥,它就返回啥。

如果Put弄明白了,那么Delete请求就太简单了,看代码:

 

[java]  view plain  copy
 
  1.  /** 
  2.   * @category 删除一条主数据记录 
  3.   * @author PQF 
  4.   */  
  5.  @Test  
  6.  public void testMasterDataControllerDeleteMasterData(){  
  7.      try {  
  8.            
  9.          String url = "http://localhost:"+8081+"/v1/masterdata/200";  
  10.          ResponseEntity<String> exchange = template.exchange(url, HttpMethod.DELETE, null, String.class);  
  11.          String body = exchange.getBody();  
  12.          Assert.assertNotNull("删除一条主数据记录失败", body);  
  13.          Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);  
  14.          System.err.println(exchange);  
  15.      } catch (Exception e) {  
  16. e.printStackTrace();  
  17.   
  18.  }  


是不是很简单???以上均是使用Junit4,所以测试的方法名称无需加test 也可行,但要使用@Test注解,表明这是你要测试的方法,至于其他的一些注解我就不多说了,网上资料太多了。

下面说说断言吧。Assert源码里面的方法均是由static修饰,什么意思呢?就是说你完全可以直接写assertTrue(),而不用Assert.assertTrue()。里面大约11种方法,似乎都是大同小异,真正实用的没几个,再去掉重载的,也就是名称重复的,似乎没啥了。但是它写的确实逆向的,什么意思呢?看下源码:

 

[java]  view plain  copy
 
  1. static public void assertTrue(String message, boolean condition) {  
  2.         if (!condition) {  
  3.             fail(message);  
  4.         }  
  5.     }  


再拿我写的举例:

 

[java]  view plain  copy
 
  1. Assert.assertTrue("删除一条主数据记录=>测试失败", Integer.valueOf(body)>0);  


当条件为false的时候才会触发自定义的返回信息,为true的时候就啥也不管了。当我们把它用在程序里的时候,会直接抛异常,程序不会再往下走了。有人说,程序中太多的使用断言并非好事,但我个人仍然坚持,断言毕竟比一大堆的if  else条件判断要好的多。

转载自:http://blog.csdn.net/u011550710/article/details/76638893

转载于:https://www.cnblogs.com/xzhuan/articles/springbootjunitassert.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值