AssertJ使用教程(二)
上一期介绍了AssertJ一些常用的Common API,这期介绍关于Object和String的Assert API。
Object assertions
下面的Assertions是针对Object的一些测试,同时也将介绍Common Assertions中没有介绍到的usingComparator测试方法。
Extracting和Returns
用于从对象中提取一个或多个属性进行后续的测试。
注意:
- 如果被提取的对象是一个Map,那么其propertyOrField参数会作为Map的Key进行提取。
- 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)
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中的空白符号,判断其是否包含