programing tip

Mockito를 사용하여 모의 객체에서 확인 된 예외를 throw하십시오.

itbloger 2020. 6. 26. 18:56
반응형

Mockito를 사용하여 모의 객체에서 확인 된 예외를 throw하십시오.


특정 메소드가 호출 될 때 조롱 된 객체 중 하나가 확인 된 예외를 발생 시키려고합니다. 나는 다음을 시도하고있다.

@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
    List<String> list = mock(List.class);
    when(list.get(0)).thenThrow(new SomeException());
    String test = list.get(0);
}

public class SomeException extends Exception {
}

그러나 다음과 같은 오류가 발생합니다.

org.testng.TestException: 
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException

Mockito 문서를 보면 Mockito를 사용 RuntimeException하여 모의 객체에서 확인 된 예외를 던질 수 없습니까?


Java API 목록을 확인하십시오 . get (int) 메소드는 RuntimeException을 확장하는 IndexOutOfBoundException 만 발생 시키도록 선언됩니다. Mockito에게 특정 메소드 호출에 의해 던져 질 수없는 예외를 던지도록 지시하려고합니다.

더 명확히하기 위해. List 인터페이스는 get () 메소드에서 확인 된 예외를 제공하지 않으므로 Mockito가 실패합니다. 모의 List를 만들 때 Mockito는 List.class의 정의를 사용하여 모의를 만듭니다. 로 지정하는 동작이 when(list.get(0)).thenThrow(new SomeException())List.class의 메소드 서명과 일치하지 않으므로 Mockito가 실패합니다. 정말로 이것을 원한다면 , API가 유일하게 유효한 예외 임을 던지기 때문에 Mockito가 던지 new RuntimeException()거나 더 나은 던지기를하십시오 new ArrayIndexOutOfBoundsException().


해결 방법은 방법을 사용하는 willAnswer()것입니다.

예를 들어 다음은 다음을 사용하여 작동합니다 (그리고 던지지 MockitoException않지만 실제로 Exception필요한 경우 체크 던집니다 ) BDDMockito.

given(someObj.someMethod(stringArg1)).willAnswer( invocation -> { throw new Exception("abc msg"); });

평범한 Mockito와 동등한 doAnswer방법으로

참고 URL : https://stackoverflow.com/questions/3762047/throw-checked-exceptions-from-mocks-with-mockito

반응형