2015-06-20 4 views
1

Есть ли Hamcrest Matcher, что позволяет мне утверждать, что результат метода, возвращающего объект Collection, имеет хотя бы один объект, который содержит свойство с определенным значением?JUnit Hamcrest утверждение

Например:

class Person { 
    private String name; 
} 

Метод тестируемой возвращает коллекцию Person. Мне нужно утверждать, что по крайней мере один Человек называется Петром.

ответ

2

Во-первых, вам необходимо создать Matcher, который может совпадать с именем Person. Затем вы можете использовать hamcrest's CoreMatchers#hasItem, чтобы проверить, соответствует ли Collection предмет, соответствующий этому матчу.

Лично я хотел бы объявить такие matchers анонимно в 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 (люди, hasItem (hasProperty (" name ", equalTo (" Peter "))));' –

+0

@StefanBirkner приятное улучшение , благодаря! – Mureinik

Смежные вопросы