2015-06-20 89 views
1

是否有一個Hamcrest Matcher乾淨地讓我斷言返回對象的方法的結果至少有一個對象包含具有某個值的屬性?JUnit Hamcrest斷言

例如:

class Person { 
    private String name; 
} 

的方法下測試返回的Person集合。 我需要聲明至少有一個人被稱爲彼得。

回答

2

首先,您需要創建一個Matcher,它可以匹配Person的名稱。然後,您可以使用hamcrest的CoreMatchers#hasItem來檢查Collection是否有這個mathcer匹配的項目。

就個人而言,我喜歡在static方法作爲一種語法制糖的匿名聲明這樣的匹配:

public class PersonTest { 

    /** Syntactic sugaring for having a hasName matcher method */ 
    public static Matcher<Person> hasName(final String name) { 
     return new BaseMatcher<Person>() { 
      public boolean matches(Object o) { 
       return ((Person) o).getName().equals(name); 
      } 

      public void describeTo(Description description) { 
       description.appendText("Person should have the name ") 
          .appendValue(name); 
      } 
     }; 
    } 

    @Test 
    public void testPeople() { 
     List<Person> people = 
      Arrays.asList(new Person("Steve"), new Person("Peter")); 

     assertThat(people, hasItem(hasName("Peter"))); 
    } 
} 
+0

完美的解釋。謝謝! –

+0

你甚至可以使用hasProperty匹配器來避免寫一個hasName匹配器:assertThat(people,hasItem(hasProperty(「name」,equalTo(「Peter」))));' –

+0

@StefanBirkner好的改進, 謝謝! – Mureinik