Hamcrest
Matchers that can be combined to create flexible expressions of intent
使用Hamcrest
@Test
public void test_hamcrest_using() {
boolean a = true;
boolean b = true;
// all statements test the same
// a==b
assertThat(a, is(b));
assertThat(a, is(equalTo(b)));
assertThat(a, equalTo(b));
// 满足任意一个条件
assertThat("test", anyOf(is("testing"), containsString("est")));
// 类型判断
assertThat(Long.valueOf(1), instanceOf(Long.class));
// 容器数据判断
List<Integer> list = Arrays.asList(2, 3, 4);
assertThat(list, hasSize(3));
assertThat(list, contains(2, 3, 4));
assertThat(list, containsInAnyOrder(4, 3, 2));
assertThat(list, everyItem(greaterThan(1)));
// 自定义matcher
assertThat("aaabbbaaaa", RegexMatcher.matchesRegex("a*b*a*"));
}
常用的Hamcrest matchers
-
allOf- matches if all matchers match (short circuits) -
anyOf- matches if any matchers match (short circuits) -
not- matches if the wrapped matcher doesn’t match and vice -
equalTo- test object equality using the equals method -
is- decorator forequalToto improve readability -
hasToString- test Object.toString -
instanceOf,isCompatibleType- test type -
notNullValue,nullValue- test for null -
sameInstance- test object identity -
hasEntry,hasKey,hasValue- test a map contains an entry, key or value -
hasItem,hasItems- test a collection contains elements -
hasItemInArray- test an array contains an element -
closeTo- test floating point values are close to a given value -
greaterThan,greaterThanOrEqualTo,lessThan,lessThanOrEqualTo -
equalToIgnoringCase- test string equality ignoring case -
equalToIgnoringWhiteSpace- test string equality ignoring differences in runs of whitespace -
containsString,endsWith,startsWith- test string matching
自定义Hamcrest matcher
public class RegexMatcher extends TypeSafeMatcher<String> {
private final String regex;
public RegexMatcher(final String regex) {
this.regex = regex;
}
@Override
public void describeTo(final Description description) {
description.appendText("matches regular expression=`" + regex + "`");
}
@Override
public boolean matchesSafely(final String string) {
return string.matches(regex);
}
// matcher method you can call on this matcher class
public static RegexMatcher matchesRegex(final String regex) {
return new RegexMatcher(regex);
}
}