бросить проверенные исключения из глумится с 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 94

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 метод