具有自定义stacktrace的Mockito.doThrow

时间:2018-06-30 07:05:10

标签: java exception mockito stack-trace

我正在尝试对特定情况进行单元测试,这需要我使用特定的堆栈跟踪元素引发异常。

我基本上是这样做的:

    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);

但是在被测方法中,抛出的异常不包含此元素,它包含对单元测试类的堆栈跟踪。

Mockito是否可以完全按照我的要求抛出异常?还是会始终覆盖堆栈跟踪?

2 个答案:

答案 0 :(得分:1)

即使由Beginning deployment of service [default]... ERROR: gcloud crashed (UnicodeDecodeError): 'ascii' codec can't decode byte 0xeb in position 14: ordinal not in range(128) If you would like to report this issue, please run the following command: gcloud feedback To check gcloud for common problems, please run the following command: gcloud info --run-diagnostics Exited with code 1 完成,引发异常的行为也将重写其堆栈跟踪。 解决此问题的一种方法不是使用真正的异常,而是对其进行模拟:

doThrow

答案 1 :(得分:1)

执行此操作的另一种方法是使用doAnswerthenAnswer引发异常:

Mockito.doAnswer((invocation) -> {
    throw exception;
}).when(stk).process(project, claim);

这将使原始堆栈跟踪保持完整,而不是让Mockito弄乱它。