Java Mockito.doThrow与自定义stacktrace

Java Mockito.doThrow与自定义stacktrace,java,exception,mockito,stack-trace,Java,Exception,Mockito,Stack Trace,我试图对一个特定场景进行单元测试,该场景要求我抛出一个带有特定堆栈跟踪元素的异常 基本上我是这样做的: final RuntimeException exception = new RuntimeException(); exception.setStackTrace( new StackTraceElement[] { new StackTraceElement( Claims.class.getCanon

我试图对一个特定场景进行单元测试,该场景要求我抛出一个带有特定堆栈跟踪元素的异常

基本上我是这样做的:

    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是否可以完全按照我的要求抛出异常?还是总是覆盖堆栈跟踪?

引发异常的行为将重写其堆栈跟踪,即使它是由
doThrow
完成的。 解决这个问题的一种方法不是使用真正的异常,而是模拟它:

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

另一种方法是使用
doAnswer
thenAnswer
来抛出异常:

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

这将保持原始堆栈跟踪完好无损,而不是让Mockito破坏它。

@Mureinki谢谢,就是这样。为什么测试中需要使用特定的堆栈跟踪?依赖异常消息是脆弱的;依赖堆栈跟踪更是如此。我有一个处理程序将所有异常发送到队列中。但如果队列机制中有异常,它将进入循环。仅当异常不是来自队列方法时,我才想将异常发送到队列中-因此我想检查StackTraceElements以查看异常来自何处。听起来,通过从队列方法中抛出特定类型的异常(例如,
QueueingMethodException
)会做得更好,然后让你的捕获忽略这些。