나는 클래스에서 특정 메서드가 호출 될 때 추상 예외가 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이이 클래스를 확장하므로). 더 좋은 방법이 있다면 나는 단지 궁금했다?
감사
대단히 감사합니다. 나는 이것을 일찍 생각하지 않았다는 것을 믿을 수 없다! 미래의 언젠가 추가 된 메소드가 추가 된 추상 클래스의 기회로부터 자신을 보호하기 위해 제 2의 제안을 할 것입니다. – JoshDavies
나는'thenThrow'도 수업을 수락한다고 생각합니다. 그래서'Mockito.when (mockDAO.getDatabaseResults()). thenThrow (ProblemException.class);' – bowmore