Mockito.doThrow с пользовательской трассировкой стека - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь выполнить модульное тестирование определенного сценария, который требует, чтобы я выдал исключение с конкретным элементом трассировки стека.

В основном я делаю:

    final RuntimeException exception = new RuntimeException();
    exception.setStackTrace(
        new StackTraceElement[] {
            new StackTraceElement(
                Claims.class.getCanonicalName(),
                "add",
                "Claims.java",
                123
            )
        }
    );
    Mockito.doThrow(exception).when(stk).process(project, claim);

Но в тестируемом методе выброшенное исключение не содержит этот элемент, оно содержит трассировку стека до класса модульного теста.

Может ли Мокито бросить исключение именно так, как я хочу? Или он всегда будет переопределять трассировку стека?

1 Ответ

0 голосов
/ 30 июня 2018

При создании исключения будет переписана его трассировка стека, даже если это сделано с помощью doThrow. Один из способов обойти это - не использовать настоящее исключение, а посмеяться над ним:

RuntimeException exception = mock(RuntimeException.class);
when(exception.getStackTrace()).thenReturn(
    new StackTraceElement[] {
        new StackTraceElement(
            Claims.class.getCanonicalName(),
            "add",
            "Claims.java",
            123
        )
    }
);
...