Подтвердить что ты не робот

Выдает исключение RuntimeException при вызове unstubbed метода

Я использую Мокито. Я хочу добавить RuntimeException, когда вызывается метод без метки.

Есть какой-либо способ сделать это?

4b9b3361

Ответ 1

Вы можете установить ответ по умолчанию для макета. Все методы, которые не были обрезаны, будут использовать этот ответ по умолчанию.

public void testUnstubbedException() {
    // Create a mock with all methods throwing a RuntimeException by default
    SomeClass someClass = mock( SomeClass .class, new RuntimeExceptionAnswer() );

    doReturn(1).when(someClass).getId(); // Must use doReturn

    int id = someClass.getId(); // Will return 1

    someClass.unstubbedMethod(); // Will throw RuntimeException
}

public static class RuntimeExceptionAnswer implements Answer<Object> {

    public Object answer( InvocationOnMock invocation ) throws Throwable {
        throw new RuntimeException ( invocation.getMethod().getName() + " is not stubbed" );
    }

}

Обратите внимание, что вы не можете использовать when с этой функциональностью, так как метод вызывается до when (Как работает mockito при() вызове?), и он будет бросать RuntimeException, прежде чем макет переходит в режим stubbing.

Поэтому для этого нужно использовать doReturn.

Ответ 2

Лучший способ сделать это - статические методы verifyNoMoreInteractions и ignoreStubs. Назовите их после "действия" части вашего теста; и вы получите отказ, если какие-либо нераскрытые методы были вызваны, но не проверены.

verifyNoMoreInteractions(ignoreStubs(myMock));

Это описано в https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification, хотя я считаю, что пример кода в настоящее время содержит опечатку.

Ответ 3

Вы издеваетесь над целым классом, и результат заключается в том, что все методы вернут null.

Затем вы можете использовать doReturn(...), чтобы изменить это поведение. Точно так же вы можете использовать doThrow(...), чтобы (как я помню только void) методы генерировали исключения.

Отвечает ли это на ваш вопрос?