2013-04-27 3 views
3

나는 클래스에서 특정 메서드가 호출 될 때 추상 예외가 throw되도록하는 유스 케이스가 있습니다.Mockito를 사용하여 추상 예외를 던질 수 있습니까?

나는 이것을하기 위해 Mockito를 사용하고 있지만, Mockito는 메서드가 호출 될 때 단순히 예외를 throw하지 않는다는 것을 알아 차렸다.

클래스를 테스트 할 :

public void doSomething() throws CustomException { 
    try { 
    Collection<T> results = dao.getDatabaseResults(); 
     } catch (ProblemException e) { 
      throw new CustomException("There was an exception", e); 
    } 
} 

문제 예외 클래스 :

public abstract class ProblemException extends RuntimeException { 

    public ProblemException(String message) { 
     super(message); 
    } 

    public ProblemException(String message, Throwable e) { 
     super(message, e); 
    } 

테스트 클래스 :

public testDoSomething() throws Exception { 
    CustomDAO mockDAO = Mockito.mock(CustomDAO.class); 

    Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException); 

    try { 
     foo.doSomething(); 
     Assert.fail(); 
    } catch (CustomException e) { 
     //Some more asserts 
    } 

현재 위의 테스트 클래스가 컴파일되지 않습니다 '당신이 할 수 있기 때문에 abstract 클래스의 새로운 인스턴스를 생성한다.

AbstractException 클래스를 변경할 수있는 액세스 권한이 없으며 DAO 클래스의 getDatabaseResults() 메서드에서 throw되는 예외 유형도 변경할 수 없습니다.

이 문제에 대해 가장 깨끗한 해결책에 대해 제안 해 주시겠습니까?

내가 생각할 수있는 한 가지는 doSomething() 메서드 내에서 RuntimeException을 잡는 것입니다 (ProblemException이이 클래스를 확장하므로). 더 좋은 방법이 있다면 나는 단지 궁금했다?

감사

답변

8

는 직접 추상 클래스를 인스턴스화 할 수 없습니다,하지만 당신은 쉽게 익명의 서브 클래스를 인스턴스화 할 수 있습니다, 당신은 어떤 방법을 정의하도록 강요하지 않는 것처럼 즉,이 경우 아주 사소한 :

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException(){}); 
을 추상 클래스가 다른 방법 당신의 정의를 강요하는 경우 D

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(Mockito.mock(ProblemException.class)); 

이 나을 :

양자 택일로, 당신은 또 다른 모의 사용할 수 있습니다 너의 시험에 신경 쓰지 마라.

+0

대단히 감사합니다. 나는 이것을 일찍 생각하지 않았다는 것을 믿을 수 없다! 미래의 언젠가 추가 된 메소드가 추가 된 추상 클래스의 기회로부터 자신을 보호하기 위해 제 2의 제안을 할 것입니다. – JoshDavies

+0

나는'thenThrow'도 수업을 수락한다고 생각합니다. 그래서'Mockito.when (mockDAO.getDatabaseResults()). thenThrow (ProblemException.class);' – bowmore

관련 문제