【发布时间】:2015-04-03 12:46:06
【问题描述】:
用于单元测试目的和模板方法模式, 我需要动态调用一些方法,像这样:
//Unit test method call to wrap into a global test logic
Method m = myobject.getClass().getMethod("run");
m.invoke(...);
这是可行的,但是当方法失败(断言失败或运行时异常)时,我无法获得完整的失败跟踪。例如,如果你有一个序列调用:method1() -> method2() -> method3() 并且method3失败,您有以下失败跟踪:
java.lang.<SomeError>:
at myexample.MyClass1.method3()
at myexample.MyClass1.method2()
at myexample.MyClass1.method1()
at myexample.Entrypoint.someEntrypoint()
这是在代码中显式调用“method1()”时的正常显示。 但如果你这样做:myobject.getClass().getMethod("method1").invoke()。 如果method3失败,你有以下失败跟踪:
java.lang.<SomeError>:
at myexample.Entrypoint.someEntrypoint() // calling m.invoke()
因此,当使用反射 (m.invoke()) 调用 method1 时,失败跟踪会在 invoke() 而不是 invoke() -> method2() -> method3() 处停止。有没有办法获得完整的跟踪?谢谢。
注意:Thread.currentThread().getStackTrace() 不能解决问题并提供类似的输出。
【问题讨论】:
标签: java exception reflection junit