бросить проверенные исключения из макетов с мокито - PullRequest
123 голосов
/ 21 сентября 2010

Я пытаюсь, чтобы один из моих поддельных объектов выдавал проверенное исключение при вызове определенного метода.Я пытаюсь следующее.

@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 , они используют только RuntimeException Разве нельзя выбрасывать отмеченные исключения из фиктивного объекта с помощью Mockito?

Ответы [ 2 ]

170 голосов
/ 21 сентября 2010

Проверьте API Java для Список . Метод get (int) объявлен для выброса только исключения IndexOutOfBoundException, которое расширяет RuntimeException. Вы пытаетесь заставить Mockito выдать исключение, которое недопустимо для этого конкретного вызова метода.

Для уточнения. Интерфейс List не предоставляет выброшенное исключение для метода get (), поэтому Mockito не работает. Когда вы создаете фиктивный список, Mockito использует определение List.class, чтобы создать его макет. Поведение, которое вы указываете с помощью when(list.get(0)).thenThrow(new SomeException()), не соответствует сигнатуре метода в List.class, поэтому Mockito завершается ошибкой. Если вы действительно хотите это сделать, то предложите Mockito выбросить new RuntimeException() или даже лучше - new ArrayIndexOutOfBoundsException(), поскольку API указывает, что это единственное допустимое исключение, которое будет выдано.

55 голосов
/ 15 января 2018

Обходной путь должен использовать метод willAnswer().

Например, следующее работает (и не выдает MockitoException, но на самом деле выдает проверенный Exception, как требуется здесь), используя BDDMockito:

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

Эквивалент для простого Mockito будет использовать doAnswer метод

...