问题描述
在运行Junit时遇到异常,不确定导致该问题的代码部分: (使用ANT-1.9.4,ANT_OPTS = -Xmx10G) ()
Tests run: 544,Failures: 1,Errors: 0,Time elapsed: 10,258.816 sec
[junit] Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
[junit] at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
[junit] at java.lang.StringCoding.encode(StringCoding.java:344)
[junit] at java.lang.StringCoding.encode(StringCoding.java:387)
[junit] at java.lang.String.getBytes(String.java:958)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter.endTestSuite(PlainJUnitResultFormatter.java:152)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.fireEndTestSuite(JUnitTestRunner.java:619)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:452)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:911)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:768)
运行测试并开始生成测试报告后,将引发异常。
这是配置junit的方式:
<junit fork="yes" newenvironment="false" haltonfailure="no" failureproperty="junit.failure" printsummary="yes" maxmemory="10096m">
解决方法
确定要使用ANT 1.9.4吗?
您的堆栈跟踪与ANT版本1.8.4中的PlainJUnitResultFormatter的源代码匹配:
out.write(sb.toString().getBytes());
而在ANT版本1.9.4中PlainJUnitResultFormatter的源代码中:
write(StringUtils.LINE_SEP);
发生异常的地方没有String.getBytes()
的呼叫。
问原因是来自ANT 1.9.4 release notes的评论:
- 更改为JUnitTestRunner和PlainJUnitResultFormatter以进行 OutOfMemoryErrors的可能性较小。 Bugzilla报告45536
因此解决方案是升级到ANT 1.9.4或更高版本