2011-11-30 4 views
11

if 문에 사용하는 설탕 프레임 워크로 hamcrest을 사용하고 싶습니다. 단호한 단위 테스트가 아니라 원시 생산 코드입니다. 그냥 AssertThat 좋아하지만 단지 부울을 반환, 오류를 throw하지 않고생산 코드에서 Hamcrest matchers를 사용하는 방법은 무엇입니까?

if (isNotEmpty(name)) return //.... 

또는

if (isEqual(name, "John")) return //... 

같은

뭔가. 가능합니까?

답변

4

은 다음 구문을 제공 bool project있다 :

if(the(name, is(equalTo("Alex")))) { 
... 
} 
+0

없이 매처 (matcher)를 사용하는 방법 와우, 정말 인상적입니다! – Vitamon

+1

IMHO bool 프로젝트는 간단한 메서드 "the"에 대한 약간의 과잉입니다. 비록 추가적인 matchers를 제공하지만, 이것들은 (예 : allOf, anyOf, either, both 등) Hamcrest 것들의 중복입니다. – Jonas

5

그것은 단지 자바 일뿐입니다. 당신이 선택한 것을 당신이 선택합니다. Hamcrest homepage는 말한다 :

가 '일치'규칙을 선언적으로 정의 할 다른 프레임 워크에서 사용할 수 있도록 정규 객체 라이브러리 (또한 제약 조건 또는 술어로 알려진)를 제공합니다. 일반적인 시나리오에는 프레임 워크 테스트, 라이브러리 조롱 및 UI 유효성 검사 규칙이 포함됩니다.

참고 : Hamcrest는 테스트 라이브러리되지 않습니다 : 단지 매처 (matcher)가 테스트를위한 매우 유용하다는 발생합니다.

또한 Hamcrest를 사용하는 a page on the other frameworks도 있습니다.

+0

난 그냥 작업 예제를 필요로 동의, assertThat – Vitamon

5

matches(value) 메서드를 Matcher 인스턴스로 사용할 수 있습니다.

if (equalTo("John").matches(name)) { ... } 

는 가독성을 향상 assertThat 유사 자신의 도우미 메서드를 만듭니다. 당신이 checkThat 같은 ifTrueThat 같은보다 더 좋은 이름을 가지고 올 경우

public static <T> boolean checkThat(T actual, Matcher<? super T> matcher) { 
    return matcher.matches(actual); 
} 

... 

if (checkThat(name, equalTo("John"))) { ... } 

댓글에 추가하십시오. :)

5

David의 답변에 이어 우리는 현재 정확히 이것을하고 있으며 우리의 도우미 메서드는 "the()"라고합니다. 마지막에 약간의 혀짤배기-Y를 얻을 수 있지만, 심지어 고객을위한 매우 읽을 수

if(the(name, is(equalTo("John")))) {...} 

:이 같은 코드에 연결됩니다.

관련 문제