hamcrest의 Generic 타입 체킹은 정말 최악인것 같다.
뭔가 근본적인 설계가 잘못 돼 있는 느낌인걸? 특히 컬렉션 관련 부분이 그렇다.
아무튼, hasProperty()라는 Matcher가 있는데, 객체의 특정 필드값만을 비교 대상으로 지정할고 싶을 때 사용한다.
예를 들면 이런식이다.
users 컬렉션의 객체 중에 "name" 필드의 값이 "김태희"인 객체가 하나라도 있으면 true가 된다. User 객체 전체를 비교하는게 아니라, "name" 필드의 값만 비교하는 것이다.
코드가 상당히 난잡하다는 것을 몸소 느낄 수 있을 것 같다. 하지만 어쨌든 가끔씩 유용하게 사용할 만한 매처이다.
단일 객체 비교시에는 큰 의미가 없어 보이고, 컬렉션에서 특정 필드의 값을 검사할 때 유용할 법하다.
처음에 hasProperty를 소개한 해외 블로그의 경우에는 Generic을 정상적으로 못 쓰고 users 컬렉션을 (Iterable<Object>) 형태로 캐스팅하는 식으로 해결하고 있었다. 어쨌든 내가 보기엔 타입을 Matcher.<User>hasItem(..) 형태로 명시하는게 더 나아 보인다.
hamcrest의 컬렉션 관련 매처들은 이곳 저곳에서 사람 복잡하게 만드는 느낌이다.
- 더 나은 해결책이 있다면 좀 공유해주시면 감사하겠습니다.
더욱 자세한 사항은 http://wiki.kwonnam.pe.kr/java/junit/hamcrest에 정리해두었다.
뭔가 근본적인 설계가 잘못 돼 있는 느낌인걸? 특히 컬렉션 관련 부분이 그렇다.
아무튼, hasProperty()라는 Matcher가 있는데, 객체의 특정 필드값만을 비교 대상으로 지정할고 싶을 때 사용한다.
예를 들면 이런식이다.
List<User> users = new ArrayList<User>();
users.add(new User("이하늬", 20, "예뻐~")); // name, age, description
users.add(new User("김태희", 30, "더 예뻐~"));
assertThat(users, Matchers.<User>hasItem(Matchers.<User>hasProperty("name", is("김태희"))));
users 컬렉션의 객체 중에 "name" 필드의 값이 "김태희"인 객체가 하나라도 있으면 true가 된다. User 객체 전체를 비교하는게 아니라, "name" 필드의 값만 비교하는 것이다.
코드가 상당히 난잡하다는 것을 몸소 느낄 수 있을 것 같다. 하지만 어쨌든 가끔씩 유용하게 사용할 만한 매처이다.
단일 객체 비교시에는 큰 의미가 없어 보이고, 컬렉션에서 특정 필드의 값을 검사할 때 유용할 법하다.
처음에 hasProperty를 소개한 해외 블로그의 경우에는 Generic을 정상적으로 못 쓰고 users 컬렉션을 (Iterable<Object>) 형태로 캐스팅하는 식으로 해결하고 있었다. 어쨌든 내가 보기엔 타입을 Matcher.<User>hasItem(..) 형태로 명시하는게 더 나아 보인다.
hamcrest의 컬렉션 관련 매처들은 이곳 저곳에서 사람 복잡하게 만드는 느낌이다.
- 더 나은 해결책이 있다면 좀 공유해주시면 감사하겠습니다.
더욱 자세한 사항은 http://wiki.kwonnam.pe.kr/java/junit/hamcrest에 정리해두었다.
공유하기 버튼
|
|







최근 덧글