бросить проверенные исключения из глумится с Mockito
Я пытаюсь, чтобы один из моих издевавшихся объектов бросал проверенное исключение при вызове определенного метода. Я пытаюсь сделать следующее.
@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
смотреть на!--8-->документация Mockito, они используют только RuntimeException
, разве нельзя выбросить проверенные исключения из макетного объекта с помощью Mockito?
2 ответа:
Проверьте Java API для список. Метод get (int) объявляется для создания только IndexOutOfBoundException, который расширяет RuntimeException. Вы пытаетесь сказать Mockito бросить исключение, которое недопустимо, чтобы быть брошенным этим конкретным вызовом метода.
для дальнейшего уточнения. Интерфейс List не предоставляет проверенное исключение, которое будет выброшено из метода get (), и именно поэтому Mockito не работает. Когда вы создаете список издевательств, Mockito использует определение списка.класс для создания своего макета. Поведение, которое вы указываете с помощью
when(list.get(0)).thenThrow(new SomeException())
не соответствует сигнатуре метода в список.класс, так что Мокито терпит неудачу. Если вы действительно хотите сделать это, то есть Mockito кинутьnew RunTimeException()
или даже лучше броситьnew ArrayIndexOutOfBoundsException()
так как API указывает, что это единственное допустимое исключение, которое нужно бросить.
обходной путь заключается в использовании
willAnswer()
метод.например следующие работы (и не кинуть
MockitoException
но на самом деле бросает провереноException
как требуется здесь) с помощьюBDDMockito
:given(someObj.someMethod(stringArg1)).willAnswer( invocation -> { throw new Exception("abc msg"); });
эквивалент для простого Mockito будет использовать
doAnswer
метод