gpt4 book ai didi

java - junitreport : xslt fails with StackOverflowError when there are many newlines/linefeeds

转载 作者:行者123 更新时间:2023-11-30 09:44:05 25 4
gpt4 key购买 nike

我正在使用 ant 1.8.2。假设测试因 stackoverflow 错误而失败。

import junit.framework.TestCase;

/**a failing test */
public class FailingTest extends TestCase
{

public void testFail() {
testFail();// gives stackoverflow- result xml is now a large document
}
}

运行 junitreport 将失败并出现以下错误

[junitreport] jar:file://lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl:65:57: Fatal Error! java.lang.StackOverflowError Cause: java.lang.StackOverflowError

原因似乎是测试结果 XML 文件中的大文本内容。

 <testcase classname="chs.FailingTest" name="testFail" time="0.012">
<error type="java.lang.StackOverflowError">java.lang.StackOverflowError
at chs.FailingTest.testFail(FailingTest.java:14)
at chs.FailingTest.testFail(FailingTest.java:14)
at chs.FailingTest.testFail(FailingTest.java:14) ....

我想 xslt 需要修剪并跳过大错误消息。可能的解决方法是什么?

//临时修复:从结果 html 中跳过如此大的文本在 junit-xslt 文件中需要编辑

<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:if test="string-length($word) &lt; 31024 "> //very large size here causes stackoverflow
<xsl:choose>
<xsl:when test="contains($word, '&#xa;')">
<xsl:value-of select="substring-before($word, '&#xa;')"/>
<br/>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="substring-after($word, '&#xa;')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$word"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>

最终修复:看到下面的答案后,我检查了 ant development 站点。SVN 有新的 xslt:http://svn.apache.org/viewvc/ant/core/trunk/src/etc/junit-frames-xalan1.xsl?view=co&content-type=text%2Fplain , 将模板更新为如下

<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:param name="br"><br/></xsl:param>
<xsl:value-of select='stringutils:replace(string($word),"&#xA;",$br)'/>
</xsl:template>

最佳答案

将代码转换为 XSLT 2.0:

<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:for-each select="tokenize($word, '&#xa;')">
<xsl:if test="position() != 1"><br/></xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>

或者,使用 Saxon 作为 XSLT 处理器运行现有代码。 Saxon 实现了尾调用优化,将这个递归模板变成了一个普通循环。

关于java - junitreport : xslt fails with StackOverflowError when there are many newlines/linefeeds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8068392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com