====== hamcrest ====== * http://hamcrest.org/ : 원래 Java용이었으나 다양한 언어로 만들어짐. * [[http://www.javacodegeeks.com/2015/11/hamcrest-matchers-tutorial.html|Hamcrest matchers tutorial]] * [[http://www.javacodegeeks.com/2015/11/custom-hamcrest-matchers.html|Custom Hamcrest Matchers]] ===== 의존성 ===== * 의존성을 걸때는 최소한 ''hamcrest-core''와 ''hamcrest-library''를 함께 걸어줘야 충분한 Matcher들을 확보할 수 있다. * 그렇지 않으면 한번에 ''hamcrest-all''에 걸어준다. ===== hasProperty ===== * [[http://www.jarvana.com/jarvana/view/org/hamcrest/hamcrest-library/1.2.1/hamcrest-library-1.2.1-javadoc.jar!/org/hamcrest/Matchers.html#hasProperty%28java.lang.String,%20org.hamcrest.Matcher%29|hasProperty]] : CoreMatchers가 아니 [[http://mvnrepository.com/artifact/org.hamcrest/hamcrest-library|Matchers]]에 있다. * 객체의 전체를 비교하지 않고 일부 필드의 값만 비교하고자 할 때 사용한다. 특히, 컬렉션과 연동해서 사용할 때 좋다. * 단일 객체 비교 User user = new User("이하늬", 20, "몰라"); // name, age, description // 테스트 결과 Matchers.hasProperty(..) 형태로 사용해야만 제대로 작동했다. assertThat(user, Matchers.hasProperty("name", is("이하늬"))); user = new User(null, 20, "몰라"); // name, age, description assertThat(user, Matchers.hasProperty("name", nullValue())); * 컬렉션 List users = new ArrayList(); users.add(new User("이하늬", 20, "예뻐~")); users.add(new User("김태희", 30, "더 예뻐~")); assertThat(users, Matchers.hasItem(Matchers.hasProperty("name", is("김태희")))); * [[http://theholyjava.wordpress.com/2011/10/15/hasproperty-the-hidden-gem-of-hamcrest-and-assertthat/|hasProperty, the Hidden Gem of Hamcrest]] 다른 예. containsInAnyOrder. (Iterable)는 위에서 처럼 타입을 명시한다면 불필요해 보임. assertThat("Expected images", (Iterable) hotel.getImages() , containsInAnyOrder(hasProperty("filename", is("radisson1.jpg")) , hasProperty("filename", is("radisson2.jpg")))); * [[http://weblogs.java.net/blog/johnsmart/archive/2008/04/on_the_subtle_u.html|On the subtle uses of Hamcrest tests]] Generic에 관한 문제를 설명한 글인데, 여기도 마찬가지로 타입을 명시한다면 불필요한 작업으로 보임. // hamcrest의 generic 관련 문제 피해가기 List stakeholders = stakeholderManager.findByName("Health"); // 원래는 List 타입이지만 hamcrest 비교시 문제가 발행해서 List로 변경. assertThat((List) stakeholders, hasItem(hasProperty("name",is("Health Associates"))));