Hamcrest比起JUnit的assert系列方法來,有更好的可讀性,它按照參數從左到右的符合自然的順序來展示,如actual is(notNullValue()),是對測試斷言的改進。同時不會被哪個參數是actual,哪個是expect而混淆。除此之外,Hamcrest提供了更豐富的比較方法,不僅包括基本類型,也包括對象判斷、集合/數組判斷等一系列方法,同時還有allOf/anyOf這樣的組合判斷,甚至有判斷xml中是否存在相應xpath的判斷。
所有的Hamcrest支持的assert全部在org.hamcrest.Matchers類下的靜態方法。下面是幾個使用例子:
public class CoreShowcase { @Test public void test(){ assertThat(true,is(true)); assertThat(false,is(false)); assertThat("2",is(equalTo("2"))); assertThat(2,is(equalTo(2))); assertThat("aBcD",is(equalToIgnoringCase("abcd"))); assertThat("",isEmptyOrNullString()); assertThat(null,is(nullValue())); assertThat(2,is(notNullValue())); assertThat(2,greaterThan(1)); assertThat(2.01,closeTo(2,0.01)); assertThat("xyz",is(anything())); } }
public class ObjectShowcase { @Test public void test(){ Person my=new Person("341024","ZhangKe",32); assertThat(my,instanceOf(Person.class)); assertThat(my,not(sameInstance(new Person("341024")))); assertThat(my,hasToString(equalTo("341024"))); assertThat(my,hasProperty("name")); } class Person{ private String idCard; private String name; private int age; public Person(String idCard) { this.idCard = idCard; } public Person(String idCard, String name, int age) { this.idCard = idCard; this.name = name; this.age = age; } public String getIdCard() { return idCard; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return idCard; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (!idCard.equals(person.idCard)) return false; return true; } @Override public int hashCode() { return idCard.hashCode(); } } }
public class CombineShowcase { @Test public void test(){ //in both/either must have the same type assertThat("result", both(containsString("r")).and(containsString("u"))); assertThat("result",either(startsWith("x")).or(containsString("r"))); assertThat("result",allOf(notNullValue(),containsString("s"))); assertThat("result",anyOf(notNullValue(),isEmptyString())); } }