사용자 도구

사이트 도구


java:junit:hamcrest

hamcrest

의존성

  • 의존성을 걸때는 최소한 hamcrest-corehamcrest-library를 함께 걸어줘야 충분한 Matcher들을 확보할 수 있다.
  • 그렇지 않으면 한번에 hamcrest-all에 걸어준다.

hasProperty

  • hasProperty : CoreMatchers가 아니 Matchers에 있다.
  • 객체의 전체를 비교하지 않고 일부 필드의 값만 비교하고자 할 때 사용한다. 특히, 컬렉션과 연동해서 사용할 때 좋다.
  • 단일 객체 비교
    User user = new User("이하늬", 20, "몰라"); // name, age, description
     
    // 테스트 결과 Matchers.<Type>hasProperty(..) 형태로 사용해야만 제대로 작동했다.
    assertThat(user, Matchers.<User>hasProperty("name", is("이하늬")));
     
    user = new User(null, 20, "몰라"); // name, age, description
    assertThat(user, Matchers.<User>hasProperty("name", nullValue()));
  • 컬렉션
    List<User> users = new ArrayList<User>();
    users.add(new User("이하늬", 20, "예뻐~"));
    users.add(new User("김태희", 30, "더 예뻐~"));
     
    assertThat(users, Matchers.<User>hasItem(Matchers.<User>hasProperty("name", is("김태희"))));
  • hasProperty, the Hidden Gem of Hamcrest 다른 예. containsInAnyOrder. (Iterable<Object>)는 위에서 처럼 타입을 명시한다면 불필요해 보임.
    assertThat("Expected images", (Iterable<Object>) hotel.getImages()
                , containsInAnyOrder(hasProperty("filename", is("radisson1.jpg"))
                , hasProperty("filename", is("radisson2.jpg"))));
  • On the subtle uses of Hamcrest tests Generic에 관한 문제를 설명한 글인데, 여기도 마찬가지로 타입을 명시한다면 불필요한 작업으로 보임.
    // hamcrest의 generic 관련 문제 피해가기
    List stakeholders  = stakeholderManager.findByName("Health"); // 원래는 List<Stakeholder> 타입이지만 hamcrest 비교시 문제가 발행해서 List로 변경.
    assertThat((List<Object>) stakeholders, hasItem(hasProperty("name",is("Health Associates"))));
java/junit/hamcrest.txt · 마지막으로 수정됨: 2015/11/23 20:05 저자 kwon37xi