AssertJ使用教程(二)

AssertJ使用教程(二)

上一期介绍了AssertJ一些常用的Common API,这期介绍关于Object和String的Assert API。

Object assertions

下面的Assertions是针对Object的一些测试,同时也将介绍Common Assertions中没有介绍到的usingComparator测试方法。

Extracting和Returns

用于从对象中提取一个或多个属性进行后续的测试。

注意:

  1. 如果被提取的对象是一个Map,那么其propertyOrField参数会作为Map的Key进行提取。
  2. propertyOrField参数支持嵌套提取,即类似“address.street.number”的结果类似于“object.getAddress().getStreet().getNumber”。
extracting(String propertyOrField);  // 用于提取单个属性
extracting(String... propertiesOrFields);  // 用于提取多个属性,这些属性会放在一个列表中进行后续测试
extracting(String propertyOrField, 
  InstanceOfAssertFactory<?,ASSERT> assertFactory);  // 用于提取属性并进行类型转换,参见上一篇文章的asInstanceOf

extracting(Function<? super ACTUAL,T> extractor);  // 提取单个属性,与上面不同,这里会通过方法调用的方式提取
extracting(Function<? super ACTUAL,?>... extractors);  // 用方法调用的方法提取多个属性
extracting(Function<? super ACTUAL,T> extractor,
  InstanceOfAssertFactory<?,ASSERT> assertFactory);  // 用方法调用的方式提取属性,并进行类型转换

Returns:使用一个方法进行属性的提取,建议使用from方法在外包裹一层以提高可读性。(from方法在Assertions和WithAssertion里都有声明)

这里的from方法并非强制要求,只是为了提高可读性。

returns(T expected, Function<ACTUAL,T> from);  // 使用方法进行提取,举例如下

@AllArgsConstructor
@Getter
@Setter
class Person{
  private String name;
  private int age;
}
Person person = new Person("jyjdal", 120);

assertThat(person)
  .returns("jyjdal", from(Person::getName))
  .returns(120, Person::getAge);  // 这里不写from也没有问题

Has Field和Null Assertions

用于判断对象是否有一些属性或者这些属性是否为null。

hasFieldOrProperty(String name);  // 判断对象是否拥有某个属性
hasFieldOrPropertyWithValue(String name, Object value);  // 判断对象拥有由某个属性,同时判断属性的值是否符合预期

hasAllNullFieldsOrProperties();  // 如果对象的所有属性都是null,则测试通过
hasAllNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore);  // 判断对象的属性是否为null,忽略给定的属性

hasNoNullFieldsOrProperties();  // 如果对象的所有属性都不为null,则测试通过
hasNoNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore);  // 判断对象的属性是否非空,忽略给定的属性

hasOnlyFields(String... expectedFieldNames);  // 如果对象只含有给定的属性,而不含有其他的属性,则测试通过

指定Comparator

用于指定对象比较时使用的Comparator。

usingComparator(Comparator<? super ACTUAL> customComparator);  // 使用指定的Comparator而不是Object.equals方法
usingComparator(Comparator<? super ACTUAL> customComparator, String customComparatorDescription);  // 指定Comparator并添加描述
usingDefaultComparator();  // 在指定的Comparator之后重新使用默认的Comparator

关于官方文档中的问题:下面这两个方法的官方示例使用了被弃用的方法,因此在问题得到答复之前暂时不做详细说明

具体请参见:GitHub issue

usingComparatorForFields(Comparator<T> comparator, String... propertiesOrFields);  // 使用Comparator比较属性(WARNING)
usingComparatorForType(Comparator<? super T> comparator, Class<T> type);  // 使用Comparator与其他类型进行比较(WARNING)

使用废弃API的方法

被废弃的方法

String assertions

下面列举出一些和字符串相关的测试方法

Empty、Blank、Size和Line Count

isEmpty();  // 判断字符串是否是空字符串,即长度为0并且不是null
isNotEmpty();  // 判断字符串是否非空,即不是null且长度不是0
isNullOrEmpty();  // 判断对象是否是null或者是空字符串

isBlank();  // 判断字符串是否是空白字符串,即不是null,长度不为0且只包含空白字符(使用CharSequence.isWhiteSpace(char))
isNotBlank();  // 判断字符串是否不是空白字符串,即长度大于0,不是null且包含除空白字符串的其他字符串

hasSize(int expected);  // 判断字符串是否有预期的长度(使用length()方法)
hasSizeBetween(int lowerBoundary, int higherBoundary);  // 判断字符串长度是否在某个区间之内,包含两端的边界
hasSizeGreaterThan(int expected);  // 判断字符串长度是否超过预期
hasSizeGreaterThanOrEqualTo(int expected);  // 判断字符串长度是否大于等于预期值
hasSizeLessThan(int expected);  // 判断字符串长度是否小于预期
hasSizeLessThanOrEqualTo(int expected);  // 判断字符串长度是否小于等于预期值
hasSameSizeAs(CharSequence other);  // 判断两个字符串的长度是否相等
hasSameSizeAs(Object other);  // 判断字符串的长度是否与给定的数组长度相等
hasSameSizeAs(Iterable<?> other);  // 判断字符串的长度是否与给定的迭代器长度相等

hasLineCount(int expectedLineCount);  // 判断字符串行数是否符合预期

相等、匹配

相等

isEqualTo(Object expected);  // 这个之前有过介绍,使用equals方法进行判断
isNotEqualTo(Object other);  // 这个也有介绍

isEqualToIgnoringCase(CharSequence expected);  // 判断字符串是否相等,忽略大小写
isNotEqualToIgnoringCase(CharSequence expected);  // 判断字符串是否不相等,忽略大小写(即只有大小写不一致的情况下不会通过断言)

匹配

matches(CharSequence regex);  // 判断字符串是否匹配正则表达式
matches(Pattern pattern);
doesNotMatch(CharSequence regex);  // 与上面含义相反
doesNotMatch(Pattern pattern);

大小写、格式和Starts/Ends

大小写

isLowerCase();  // 判断字符串是否都是小写字母,即将字符串与其String.toLowerCase()方法的结果进行比对
isUpperCase();  // 判断字符串是否都是大写字母,即将字符串与其String.toUpperCase()方法的结果进行比对
isMixedCase();  // 判断字符串是否既包含大写字母也包含小写字母
// 一些特殊情况如下:
assertThat("a.7").isLowerCase();  // 通过
assertThat("A.7").isUpperCase();  // 通过
assertThat("").isMixedCase();  // 通过

格式

注意:下面两个方法并不是对字符串进行断言,只是更改了对象的表示方式,在报错时提供更多样的信息

inHexadecimal();  // 将对象使用十六进制进行表示
inUnicode();  // 将对象使用Unicode进行表示

Starts/Ends

startsWith(CharSequence prefix);  // 判断字符串是否以prefix开头
doesNotStartWith(CharSequence prefix);
startsWithIgnoringCase(CharSequence prefix);  // 判断字符串是否以prefix开头,忽略大小写
doesNotStartWithIgnoringCase(CharSequence prefix);

endsWith(CharSequence suffix);  // 判断字符串是否以suffix结尾
doesNotEndWith(CharSequence suffix);
endsWithIgnoringCase(CharSequence suffix);  // 判断字符串是否以suffix结尾,忽略大小写
doesNotEndWithIgnoringCase(CharSequence suffix);

字符串包含

contains(CharSequence... values);  // 判断字符串是否包含values中的内容,忽略values的顺序
contains(Iterable<? extends CharSequence> values);
doesNotContain(CharSequence... values);  // 与上面含义相反
doesNotContain(Iterable<? extends CharSequence> values);

containsPattern(CharSequence regex);  // 判断字符串是否包含给定的正则表达式
containsPattern(Pattern pattern); 
doesNotContainPattern(CharSequence pattern);  // 与上面含义相反
doesNotContainPattern(Pattern pattern);

containsAnyOf(CharSequence... values);  // 判断字符串是否包含values中的任意一个

containsIgnoringCase(CharSequence sequence);  // 判断字符串是否包含values中的内容,忽略顺序及大小写
doesNotContainIgnoringCase(CharSequence... values);  // 与上面含义相反

containsOnlyDigits();  // 判断字符串是否只包含数字
containsOnlyOnce(CharSequence sequence);  // 判断字符串是否包含sequence有且仅有一次
containsOnlyWhitespaces();  // 判断字符串是否只包含空白符号,空白符号由Character.isWhitespace(char)确定
doesNotContainOnlyWhitespaces();  // 判断字符串是否不是空白字符串,与isNotBlank的区别在于这个方法在null或空串时能够通过

containsSequence(CharSequence... values);  // 判断values中的内容是否依次在字符串中出现,且中间没有其他内容
containsSequence(Iterable<? extends CharSequence> values);
containsSubsequence(CharSequence... values);  // 判断values中的内容是否依次出现在字符串中,但是中间可以有其他内容
containsSubsequence(Iterable<? extends CharSequence> values);

containsWhitespaces();  // 判断字符串中是否出现了空白字符
doesNotContainAnyWhitespaces();  // 与上面含义相反

不常用方法

下面的API使用场景比较少见,具体使用方法请参见官网说明:

isEqualToNormalizingPunctuationAndWhitespace(CharSequence expected);  // 去掉punctuation后进行比较
// punctuation指代一下符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
isEqualToNormalizingUnicode(CharSequence expected);  // 将字符串转换成Unicode后比较字形是否一致
// 举例:Ä = \u00C4 - Ä = \u0041\u0308,二者在字形上一致,因此测试通过
isEqualToIgnoringWhitespace(CharSequence expected);  // 两边分别去掉所有的空白符号后进行匹配,强调两边分别去掉
isNotEqualToIgnoringWhitespace(CharSequence expected);  // 与上面含义相反

isEqualToNormalizingWhitespace(CharSequence expected);  // 两边同时去掉所有的空白符号后进行匹配,强调两边同时去掉
isNotEqualToNormalizingWhitespace(CharSequence expected);  // 与上面含义相反
// 上面两类方法区别如下
assertThat("Game of Thrones").isEqualToIgnoringWhitespace("Game   of   Thrones");  // 通过
assertThat("Game of Thrones").isEqualToIgnoringWhitespace("Game OF Thrones");  // 不通过

assertThat("Game of Thrones").isEqualToNormalizingWhitespace("Game   of   Thrones");  // 通过
assertThat("Game of Thrones").isEqualToNormalizingWhitespace("Game ofThrones");  // 不通过
isEqualToIgnoringNewLines(CharSequence expected);  // 两边同时去掉换行符后相匹配
isEqualToNormalizingNewlines(CharSequence expected);  // 两边分别去掉换行符后再进行匹配
// 上面两个方法区别如下
assertThat("Some textWith new lines").isEqualToIgnoringNewLines("Some text\nWith new lines");  // 通过
assertThat("Some text\nWith new lines").isEqualToIgnoringNewLines("Some text With new lines");  // 不通过

assertThat(bookName).isEqualToNormalizingNewlines("Lord of the Rings\n");  // 通过
assertThat(singleLine).isEqualToNormalizingNewlines("");  // 不通过
containsIgnoringNewLines(CharSequence... values);  // 忽略字符串和values中的换行符,判断其是否包含values中的内容
containsIgnoringWhitespaces(CharSequence... values);  // 忽略字符串和values中的空白符号,判断其是否包含
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OriginCoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值