我正在尝试对特定情况进行单元测试,这需要我使用特定的堆栈跟踪元素引发异常。
我基本上是这样做的:
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是否可以完全按照我的要求抛出异常?还是会始终覆盖堆栈跟踪?
答案 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)
执行此操作的另一种方法是使用doAnswer
或thenAnswer
引发异常:
Mockito.doAnswer((invocation) -> {
throw exception;
}).when(stk).process(project, claim);
这将使原始堆栈跟踪保持完整,而不是让Mockito弄乱它。