在运行测试时(使用或不使用Citrus)如果测试期望队列中有消息但在超时到期之前未收到消息,则可能会发生异常。
在这种情况下,我想知道哪一行抛出异常。
不幸的是,柑橘没有显示这些信息。
这是我的代码:
@Test
@CitrusTest
public void testFail() {
sequential().actions(
mycheckNoError1(),
mycheckNoError2(),
mycheckNoError3(), //this one fails , we want to know it and which line throws the ActionTimeoutException
mycheckNoError4()
);
}
protected AbstractActionContainer mycheckNoError3() {
AbstractActionContainer aCatch = catchException().exception(ActionTimeoutException.class)
.when(receive("for_soap_q")
.timeout(100L)
.validationCallback(validationCallbackFunc()
))
.addTestAction(timeoutException(Thread.currentThread().getStackTrace()));
return aCatch;
}
这里是柑橘的堆栈跟踪,它没有显示抛出异常的行:
...
INFO .c.r.LoggingReporter|
ERROR .c.r.LoggingReporter| TEST FAILED MyTest.test <package.test> Nested exception is:
com.consol.citrus.exceptions.ActionTimeoutException: Action timed out while receiving JMS message on 'testQueue'
at com.consol.citrus.jms.endpoint.JmsConsumer.receive(JmsConsumer.java:95) ~[citrus-jms-2.7.5.jar:na]
at com.consol.citrus.jms.endpoint.JmsConsumer.receive(JmsConsumer.java:60) ~[citrus-jms-2.7.5.jar:na]
at com.consol.citrus.jms.endpoint.JmsSyncConsumer.receive(JmsSyncConsumer.java:60) ~[citrus-jms-2.7.5.jar:na]
...
我找到的唯一方法是将stacktrace作为方法的参数传递timeoutException()我写道:
private TestAction timeoutException(StackTraceElement[] methodName) {
System.out.println("++++++++++ timeout Exception at line " + methodName[1].getLineNumber() + " in method: [" + methodName[1].getMethodName() + "]");
return null;
}
但我想有更好的方法可以做到这一点。
有没有办法正确配置柑橘和/或覆盖LoggingReporter以显示导致异常发生的行号?
(在这种情况下,这是一行:when(接收(&#34; for_soap_q&#34;)...)
感谢。
答案 0 :(得分:0)
您可以通过放置名为&#39; loggingReporter&#39;的bean来覆盖默认的Logging报告器。在Spring应用程序上下文中。除此之外,您还可以在选择不同的bean命名时添加自定义报告者和测试侦听器。只需将自定义侦听器添加到Spring应用程序上下文中,它们就会获得测试事件和可抛出错误以进行报告。
还要确保使用TestRunner fluent API而不是TestDesigner fluent API。 Designer稍微简单一点,但是在使用流畅的API构建测试用例时,运行器会立即执行测试操作。因此,您将获得更详细的堆栈跟踪,其中包含正确的行号,并能够设置断点以便更好地进行调试。