【问题标题】:JUnit runner gets NullPointerException from java.io.WriterJUnit runner 从 java.io.Writer 获取 NullPointerException
【发布时间】:2010-11-19 16:38:50
【问题描述】:


我从 Maven Surefire 插件收到 NullPointerException。它只发生在使用 DBUnit 的测试上。 Surefire 报告文件为空。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
org.apache.maven.surefire.booter.SurefireExecutionException: null; nested exception is java.lang.NullPointerException: null
java.lang.NullPointerException
    at java.io.Writer.write(Writer.java:140)
    at java.io.PrintWriter.newLine(PrintWriter.java:436)
    at java.io.PrintWriter.println(PrintWriter.java:585)
    at java.io.PrintWriter.println(PrintWriter.java:696)
    at org.apache.maven.surefire.report.AbstractFileReporter.testSetStarting(AbstractFileReporter.java:59)
    at org.apache.maven.surefire.report.ReporterManager.testSetStarting(ReporterManager.java:219)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:138)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] There are test failures.

当我尝试使用 JUnit 运行器从 NetBeans IDE 运行相同的测试时,我得到了相同的异常:

Exception in thread "main" java.lang.NullPointerException
        at java.io.Writer.write(Writer.java:140)
        at org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:212)
        at org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter.endTestSuite(XMLJUnitResultFormatter.java:171)
        at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.fireEndTestSuite(JUnitTestRunner.java:714)
        at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:547)
        at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1031)
        at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:888)
Test football.dao.jpa.SimpleJPATest FAILED (crashed)

java.io.Writer 类的write 方法只有一个String 参数。这意味着跑步者必须将 null 作为参数传递。但是这是怎么发生的呢?

public void write(String str) throws IOException {
    write(str, 0, str.length());
}

【问题讨论】:

    标签: java junit surefire


    【解决方案1】:

    您实际看到的是 line.separator 系统的属性为空。我无法根据我所看到的解释为什么,但如果你可以测试它,请尝试这样做:

    java.security.AccessController.doPrivileged(
                   new sun.security.action.GetPropertyAction("line.separator"));
    

    【讨论】:

    • +1,快点打败我吧。作为参考,这可以从 PrintWriter.newLine 调用派生而来,该调用简单地遵循 out.write(lineSeparator)
    • 谢谢! line.separator 属性确实为空。我是通过调用 System.setProperties(props) 和 Properties 对象引起的,该对象只包含 DBUnit 的 4 个属性。我不知道这种方法会替换所有属性。我应该更仔细地阅读 javadoc。再次感谢你们!
    • 超级棒。只是花了几个小时试图调试到这个原因。和你一样,有人用过 System.setProperties(props) 方法。
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多