junitreport: xslt завершается с ошибкой StackOverflowError, когда есть много строк новой строки - PullRequest
2 голосов
/ 09 ноября 2011

Я использую муравей 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: Фатальная ошибка! java.lang.StackOverflowError Причина: 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>

Окончательное исправление: увидев ответы ниже, я проверил сайт разработки муравьев. У 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>

Ответы [ 2 ]

1 голос
/ 10 ноября 2011
   public void testFail() {
        testFail();// gives stackoverflow- result xml is now a large document
    }

Этот метод вызывает сам себя .... без точки выхода

1 голос
/ 10 ноября 2011

Преобразование кода в 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 реализует оптимизацию хвостового вызова, который превращает этот рекурсивный шаблон в обычный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...