2016-09-16 2 views
1

JUnit과 Hamcrest를 사용하여 자동화 된 테스트를하고 있습니다. 필자의 테스트를 좀 더 읽기 쉽게하기 위해 matchesSafely 메서드에서 호출하는 코드는 예외를 throw 할 수 있지만 사용자 지정 일치 프로그램을 만들고 싶습니다. matchesSafely가 throw하는 예외를 허용하지 않는 메서드 시그니처와 같은 예외를 처리하는 방법을 잘 모르겠습니다. 그림사용자 정의 Hamcrest matchers에서 예외를 어떻게 처리해야합니까?

예 :

public static Matcher<Session> hasObjectOfType(final Class<?> cls) { 
    return new TypeSafeMatcher<Session>() { 
     /* describeTo method skipped for brevity */ 
     protected boolean matchesSafely(Session session) { 
      return session.provideList(cls.getName()).iterator().hasNext(); 
     } 
    } 
} 

그래서 session.provideList이 체크 예외를 선언하고 어떻게 든 그것을 처리 할 필요가있다 여기에 무슨. 내가 뭔가를이 처리하지만 어쩌면 내가 내려다 보이는거야의 두 가지 방법을 참조하십시오

  1. 캐치 체크 예외를 한 후 발생하는 런타임 예외를 포장.
  2. 확인 된 예외를 catch하고 false를 반환합니다. 현실에서는 TypeSafeDiagnosingMatcher를 사용하고 있습니다. 그래서 여기서는 불일치 설명이 두 가지 가능한 시나리오 (빈 목록 또는 예외가 발생했을 때)에 따라 달라야합니다.

예외를 처리하는 가장 좋은 방법은 무엇이 있을까요?

답변

1

가능한 한 빨리 실패한 테스트를 디버그 할 수 있기를 원합니다. 따라서 옵션 1을 선호해야합니다.

그런 경우 해당 "예외"테스트가 해당 런타임 예외에서 실패하게됩니다. 예외 내용을 인쇄합니다. 그래서 당신은 당신의 테스트가 어디서 왜 실패했는지 알 수 있습니다.

비교 대상 : 자동으로 예외를 "거짓"으로 바꾸십시오. assertThat으로 끝나고 일치가 실패했다고 알려줍니다. 어쩌면 당신은 결국 의미있는 메시지를 줄 수 있습니다. 그러나 여전히 : 당신은 어떤 "에너지"를 넣어야 할 것입니다. 옵션 1은 무료로 제공됩니다. try/catch rethrow.

내 조언 : 옵션 1로 이동하여 어떻게 작동하는지 확인하십시오. 그것이 어떤 이유로 든 "충분 함"이 아니라면; 그런 다음 더 많은 시간을 투자하고 옵션 2가 어떻게 든 개선 할 수 있는지 확인하십시오.

관련 문제