java - Ant JUnit 任务因 ClosedByInterruptException 而失败
问题描述
我的 JUnit 测试由于ClosedByInterruptException而失败,在完成运行测试后,它无法编写测试报告,只是停止并出现以下异常:
[junit] Exception in thread "main" Unable to write log file
[junit] at org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter.endTestSuite(XMLJUnitResultFormatter.java:197)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.fireEndTestSuite(JUnitTestRunner.java:860)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:579)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1205)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1021)
[junit] Caused by: java.nio.channels.ClosedByInterruptException
[junit] at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:202)
[junit] at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:200)
[junit] at java.nio.channels.Channels.writeFullyImpl(Channels.java:78)
[junit] at java.nio.channels.Channels.writeFully(Channels.java:101)
[junit] at java.nio.channels.Channels.access$000(Channels.java:61)
[junit] at java.nio.channels.Channels$1.write(Channels.java:174)
[junit] at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
[junit] at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.FormatterElement$DelayedFileOutputStream.flush(FormatterElement.java:394)
[junit] at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:297)
[junit] at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
[junit] at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
[junit] at java.io.BufferedWriter.flush(BufferedWriter.java:254)
[junit] at org.apache.tools.ant.util.DOMElementWriter.openElement(DOMElementWriter.java:368)
[junit] at org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:209)
[junit] at org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:222)
[junit] at org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:222)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter.endTestSuite(XMLJUnitResultFormatter.java:195)
[junit] ... 4 more
我正在使用ant-junit-1.10.5-jar。endTestSuite方法的代码片段是:
if (out != null) {
Writer wri = null;
try {
wri = new BufferedWriter(new OutputStreamWriter(out, "UTF8"));
wri.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
new DOMElementWriter().write(rootElement, wri, 0, " ");
} catch (final IOException exc) {
throw new BuildException("Unable to write log file", exc);
}
我的 JUnit ant 目标如下所示:
<junit dir="${test.path}/${test.dir}" fork="on" forkmode="once" haltonfailure="${junit.halt.on.failure}" outputtoformatters="true" printsummary="on" showoutput="true">
<sysproperty key="junit.aspectj.dump" file="woven-classes" />
<!--
<sysproperty key="junit.cobertura.agent" value="${junit.cobertura.agent}" />
-->
<sysproperty key="junit.code.coverage" value="${junit.code.coverage}" />
<sysproperty key="junit.debug" value="${junit.debug}" />
<sysproperty key="cluster.link.primary.node" value="true" />
<sysproperty key="net.sourceforge.cobertura.datafile" file="${test.path}/test-coverage/${test.type}/cobertura.ser" />
<jvmarg line="${junit.debug.jpda}" />
<jvmarg line="${junit.profile.agent}" />
<!--
<jvmarg line="${junit.cobertura.agent}" />
-->
<jvmarg value="-Xmx${junit.java.mx}" />
<jvmarg value="-Dexternal-properties=${test.properties}" />
<jvmarg value="-Dfile.encoding=UTF-8" />
<jvmarg value="-Djava.net.preferIPv4Stack=true" />
<jvmarg value="-Duser.timezone=GMT" />
<classpath location="${test.path}/test-coverage" />
<classpath refid="test.classpath" />
<formatter type="brief" usefile="false" />
<formatter type="xml" />
<batchtest fork="yes" todir="${test.path}/test-results/${test.type}">
<fileset dir="${test.path}/test-classes/${test.dir}" includes="**/${test.class}.class">
<exclude name="${test.excludes}" />
<filename regex="${junit.test.excludes}" negate="true" />
</fileset>
</batchtest>
</junit>
解决方案
推荐阅读
- ruby-on-rails - Rails 凭证只记住旧凭证?
- c++ - 如果可能,通过引用传递,否则通过值传递
- javascript - 当我更改鼠标位置时,Raycaster.intersectObjects 总是返回完全相同的数组
- html - 如何将html转换为字符串
- node.js - 为什么我应该只用护照序列化用户存储 user.id?
- swing - java.awt drawRect() 错误地解释了“宽度”和“高度”(产生右下 +1 像素)
- hive - 如何从字段中动态插入配置单元?
- python - 如何在python中通过正则表达式获取字符串的一部分
- google-cloud-platform - 在云存储桶触发器上从谷歌云功能调用谷歌语音 api
- python - 如何修复 Python 构建中的 ModuleNotFound 错误?