单元测试的框架Hamcrest

一句话介绍

Hamcrest是用于Java的单元测试的框架,它使用matcher匹配器来进行断言。在Spring-boot-starter中集成了Hamcrest,无需而外引入。

核心API
  1. is
    • 使用is匹配器使得程序更加易懂
      String str1 = "text";
      String str2 = " text ";
      assertThat(str1, is(equalToIgnoringWhiteSpace(str2)));
      
    • 用于简单数据类型的判断
      String str1 = "text";
      String str2 = "text";
      assertThat(str1, is(str2));
      
  2. not
    和is使用方式一样,只是含义相反。
    • 使用not匹配器使得程序更加易懂
      String str1 = "text";
      String str2 = " text ";
      assertThat(str1, not(equalToIgnoringWhiteSpace(str2)));
      
    • 用于简单数据类型的判断
      String str1 = "text";
      String str2 = "text";
      assertThat(str1, not(str2));
      
  3. containsString
    • 是否包含子串
      String str1 = "text123";
      String str2 = "text";
      assertThat(str1, containsString(str2));
      
  4. 以为某个字段开头/结尾
    String str1 = "text123";
    assertThat(str1, startsWith("text"));// 以某个字符开头
    assertThat(str1, endsWith("text"));// 以某个字符开头
    
  5. 判断两个对象是否为同一个实体
    Cat cat=new Cat();
    assertThat(cat, sameInstance(cat));
    
  6. 类似OR的效果
    String str = "calligraphy";
    String start = "call";
    String end = "foo";
    assertThat(str, anyOf(startsWith(start), containsString(end)));
    
  7. 类似AND的效果
    String str = "calligraphy";
    String start = "call";
    String end = "phy";
    assertThat(str, allOf(startsWith(start), endsWith(end)));
    
    匹配器

Number 匹配器

assertThat(1, greaterThan(0)); // 大于
assertThat(5, greaterThanOrEqualTo(5)); //大于等于
assertThat(-1, lessThan(0)); // 小于
assertThat(-1, lessThanOrEqualTo(5)); // 小于等于

Text 匹配器

  1. 匹配空串
    String str = "";
    assertThat(str, isEmptyString()); // 空字符串
    assertThat(str, isEmptyOrNullString()); // 空字符串或者null
    
  2. 匹配字符串相等
    String str1 = "text";
    String str2 = " text ";
    assertThat(str1, equalToIgnoringWhiteSpace(str2)); // 忽略左右空白
    assertThat(a, equalToIgnoringCase(b)); //忽略大小写
    
    Collections 匹配器
  3. 检查某个元素是否在集合中
    List<String> collection = Lists.newArrayList("ab","cd","ef");
    assertThat(collection, hasItem("cd"));
    assertThat(collection, not(hasItem("zz")));
    assertThat(collection, hasItems("cd", "ab")); // 检查多个元素是否在集合中
    
  4. 检查所有元素
    List<String> collection = Lists.newArrayList("ab","cd","ef");
    assertThat(collection, hasItems("ab","cd","ef"));
    assertThat(collection, hasItems("cd", "ab","ef")); // 错误
    assertThat(collection, hasItems("ab","cd")); // 错误
    assertThat(collection, containsInAnyOrder("cd", "ab","ef")); //正确,不区分顺序
    
  5. 为空检查
    • 集合为空检查
      List<String> collection = Lists.newArrayList("ab","cd","ef");
      assertThat(collection, empty()); // false, 用于检查集合类型
      
    • 数组为空检查
      String[] array = new String[] { "ab" };
      assertThat(array, emptyArray()); // false
      
    • map为空检查
      Map<String, String> maps = Maps.newHashMap();
      assertThat(maps, equalTo(Collections.EMPTY_MAP));
      
    • Iterable为空检查
      Iterable<String> collection = Lists.newArrayList();
      assertThat(collection, emptyIterable());
      
  6. 检查数目
    • 检查集合数目
      List<String> list = Lists.newArrayList("ab", "cd", "ef");
      assertThat(list, hasSize(3));
      
    • 检查iterable数目
      Iterable<String> list = Lists.newArrayList("ab", "cd", "ef");
      assertThat(list, iterableWithSize(3));
      
    • 检查每项的条件
      List<String> list = Lists.newArrayList("ab", "cd", "ef");
      assertThat(list, everyItem(equalTo("ab")));
      
      Bean 匹配器

定义一个City的bean

@Data
@AllArgsConstructor
public class City {
    String name;
    String state;
}
  1. 测试是否存在某个属性
    City city = new City("shenzhen", "CA");
    assertThat(city, hasProperty("state"));
    assertThat(city, hasProperty("state", equalTo("CA"))); // 判断是否存在某个属性,并且是否存在某个特性值
    
  2. 判断两个对象property值是否一样
    City city = new City("San Francisco", "CA");
    City city2 = new City("San Francisco", "CA");
    assertThat(city, samePropertyValuesAs(city2));