SpringBoot(20)

Stella981
• 阅读 867

  我们在写单元测试的时候,除了接口直接抛异常而导致该单元测试失败外,还有种是业务上的错误也代表着该单元测试失败。好比我们在测试接口的时候,

  该接口返回是1代表成功,如果是0那就代表是失败的,这个时候可以考虑使用断言。

  一、原理我们知道,我们可以通过断言来校验测试用例的返回值和实际期望值进行比较,以此来判断测试是否通过。那我们先来看下如果失败的情况下它的流程是怎么样的。

  对于断言而言,如果是错误最终都会进入下面的方法

  static public void fail(String message) {

  if (message == null) {

  throw new AssertionError();

  }

  throw new AssertionError(message);

  }

  很明显,这里有一个AssertionError对象,我们来看下这个对象。

  public class AssertionError extends Error {

  //......

  }

  我们很明显看到,它实继承是Error,而不是Exception。这说明什么,说明你无法通过try catch去捕获这个异常,只要进入断言fail中,一定会抛出异常。

  二、Assert 源码这里只展示Assert源码中常用的方法,一些不常用或者过期的方法这里就不展示了。

  public class Assert {

  /**

  * 结果 = 预期 则正确

  */

  static public void assertEquals(Object expected, Object actual)

  /**

  * 结果 != 预期 则正确

  */

  static public void assertNotEquals(Object unexpected, Object actual)

  /**

  * condition == true 则正确

  */

  static public void assertTrue(boolean condition)

  /**

  * condition == false 则正确

  */

  static public void assertFalse(boolean condition)

  /**

  * 永远是错误

  */

  static public void fail()

  /**

  * 结果不为空 则正确

  */

  static public void assertNotNull(Object object)

  /**

  * 结果为空 则正确

  */

  static public void assertNull(Object object)

  /**

  * 两个对象引用 相等 则正确(上面相当于equels 这里类似于使用“==”比较两个对象)

  */

  static public void assertSame(Object expected, Object actual)

  /**

  * 两个对象引用 不相等 则正确

  */

  static public void assertNotSame(Object unexpected, Object actual)

  /**

  * 两个数组相等 则正确

  */

  public static void assertArrayEquals(Object[] expecteds, Object[] actuals)

  /**

  * 这个单独介绍

  */

  public static void assertThat(T actual, Matcher matcher)

  }

  注意 上面每一个方法,都会有一个多一个参数的方法,这个参数为:String message。意思就是错误的情况下,我们可以输出我们自定义的message

  示例

  //这个就表示 结果 != 预期 的情况下,抛出的AssertionError 信息是我们指定的message

  static public void assertEquals(String message,Object expected, Object actual)

  上面还有一个方法需要单独介绍,那就是assertThat方法。

  三、assertThat方法大家习惯把assertThat理解成新断言,因为上面所以的功能方法,都可以通过assertThat这一个方法来实现。

  1、基本语法

  assertThat 的基本语法如下:

  assertThat( [value], [matcher statement] );

  value 是接口返回信息中,我们想要测试的变量值

  matcher statement: 是使用Hamcrest匹配符来表达的对前面变量所期望的值的声明,如果value值与matcher statement所表达的期望值相符,则测试成功,否则测试失败。

  2、基本使用

  字符串匹配符 String n = "xiao";

  // containsString:字符串变量中包含指定字符串时,测试通过

  assertThat(n, containsString("xiao"));

  // startsWith:字符串变量以指定字符串开头时,测试通过

  assertThat(n, startsWith("xi"));

  // endsWith:字符串变量以指定字符串结尾时,测试通过

  assertThat(n, endsWith("ao"));

  // euqalTo:字符串变量等于指定字符串时,测试通过

  assertThat(n, equalTo("xiao"));

  // equalToIgnoringCase:字符串变量在忽略大小写的情况下等于指定字符串时,测试通过

  assertThat(n, equalToIgnoringCase("xiao"));

  // equalToIgnoringWhiteSpace:字符串变量在忽略头尾任意空格的情况下等于指定字符串时,测试通过

  assertThat(n, equalToIgnoringWhiteSpace(" xiao "));

  int匹配符int s = 1;

  // allOf:所有条件必须都成立,测试才通过(大于1同时小于3)

  assertThat(s, allOf(greaterThan(1), lessThan(3)));

  // anyOf:只要有一个条件成立,测试就通过 (大于1或者小于2)

  assertThat(s, anyOf(greaterThan(1), lessThan(2)));

  // anything:无论什么条件,测试都通过

  assertThat(s, anything());

  // is:变量的值等于指定值时,测试通过

  assertThat(s, is(2));

  // not:和is相反,变量的值不等于指定值时,测试通过

  assertThat(s, not(1));

  double匹配符double d = 1D;

  // closeTo:浮点型变量的值在3.0±0.5范围内,测试通过

  assertThat(d, closeTo(3.0, 0.5));

  // greaterThan:变量的值大于指定值时,测试通过

  assertThat(d, greaterThan(3.0));

  // lessThan:变量的值小于指定值时,测试通过

  assertThat(d, lessThan(3.5));

  // greaterThanOrEuqalTo:变量的值大于等于指定值时,测试通过

  assertThat(d, greaterThanOrEqualTo(3.3));

  // lessThanOrEqualTo:变量的值小于等于指定值时,测试通过

  assertThat(d, lessThanOrEqualTo(3.4));

  集合匹配符List list = new ArrayList();

  // hasItem:Iterable变量中含有指定元素时,测试通过

  assertThat(list, hasItem("xiao"));

  Map m = new HashMap<>();

  // hasEntry:Map变量中含有指定键值对时,测试通过

  assertThat(m, hasEntry("xi", "xiao"));

  // hasKey:Map变量中含有指定key时,测试通过

  assertThat(m, hasKey("x"));

  // hasValue:Map变量中含有指定value值时,测试通过

  assertThat(m, hasValue("x"));

  四、测试这里对于老断言,和新断言各测试5个。

  1、老断言

  示例public class TestServiceImplTest {

  @Test

  public void test1() {

  String str = "xiao";

  assertEquals(str, "xiaoniao");//不相等,所以错误

  }

  @Test

  public void test2() {

  assertFalse(Boolean.TRUE); //不是false,所以错误

  }

  @Test

  public void test3() {

  fail("直接是错误"); //直接是错误

  }

  @Test

  public void test4() {

  assertNull("xiao"); //不为空所以为错误

  }

  @Test

  public void test5() {

  assertNotNull("xiao");//不为空,所以为正确

  }

  }

  这里应该只有第5个测试用例通过,前面4个都不通过的,我们在来看实际运行结果

SpringBoot(20)

  与实际相符,前面4个,测试用例不通过。而且可以看到第3个是我们自定义错误信息,在控制台也打印出来了。

  2、新断言

  示例import org.assertj.core.util.Lists;

  import org.junit.Test;

  import java.util.HashMap;

  import java.util.List;

  import java.util.Map;

  import static org.hamcrest.CoreMatchers.anyOf;

  import static org.hamcrest.Matchers.*;

  import static org.hamcrest.core.Is.is;

  import static org.junit.Assert.assertThat;

  public class TestServiceImplTest {

  @Test

  public void test1() {

  String str = "xiao";

  assertThat("这两字符串不相等",str, is("xiaoniao"));//不相等,所以错误

  }

  @Test

  public void test2() {

  int s = 1;

  assertThat(s, anyOf(greaterThan(1), lessThan(2)));//满足 大于1或者小于2 所以正确

  }

  @Test

  public void test3() {

  double d = 1D;

  assertThat(d, allOf(greaterThanOrEqualTo(1D),lessThan(2D)));//满足大于等于1 并且 小于2 所以正确

  }

  @Test

  public void test4() { 郑州做无痛人流多少钱http://www.zzchfk.com/

  List list = Lists.newArrayList("xiao","zhong","da");

  assertThat(list, hasItem("xiao")); //包含xiao 所以正确

  }

  @Test

  public void test5() {

  Map map = new HashMap<>();

  map.put("xiao", "xiao");

  assertThat(map, hasKey("xiao")); //该map包含该key,所以正确 郑州无痛人流医院哪家好:http://www.zztjyyxb.com/

  }

  }

  这里应该只有第1个测试用例不通过,其它都是通过的,我们在来看实际运行结果

SpringBoot(20)

  符合预期。

  好了,整篇文章到这里就结束了,下面把该项目的具体代码放到github上。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这