看来System.setOut()在此测试用例中不起作用。

这是问题描述。


test0执行System.setOut(new PrintStream(byteBuffer)),以便存储标准输出。
test0调用AddChild1_wy_v1.main
AddChild1_wy_v1.main中,xml.addChild(null)生成异常消息。
异常消息应该存储在byteBuffer中,但是似乎不是。。一旦异常消息弹出,JVM就会停止运行测试用例。并且AddChild1_wy_v1.main之后的其余代码不会执行。


jvm是否可以执行test0中剩余的代码?

NanoAddChild1_wy_v1Tests.java

package tests;

import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import net.n3.nanoxml.*;

public class NanoAddChild1_wy_v1Tests extends TestCase {

    public void test0() throws Exception {      //addchild1.out
        String result;
        ByteArrayOutputStream byteBuffer;

        byteBuffer = new ByteArrayOutputStream();
        System.setOut(new PrintStream(byteBuffer));
        AddChild1_wy_v1.main(new String[] {"/home/junghyun/Dev/nanoxml/inputs/simple.xml"});
        result = new String(byteBuffer.toByteArray());
        assertEquals(result, "Exception in thread \"main\" java.lang.IllegalArgumentException: child must not be null\n\tat net.n3.nanoxml.XMLElement.addChild(XMLElement.java:165)\n\tat AddChild1_wy_v1.main(AddChild1_wy_v1.java:47)\n");
    }
}


AddChild1_wy_v1.java

package tests;

import net.n3.nanoxml.IXMLParser;
import net.n3.nanoxml.IXMLReader;
import net.n3.nanoxml.StdXMLReader;
import net.n3.nanoxml.XMLElement;
import net.n3.nanoxml.XMLParserFactory;
import net.n3.nanoxml.XMLWriter;

public class AddChild1_wy_v1
{

    public static void main(String args[])
        throws Exception
    {
        if (args.length == 0) {
            System.err.println("Usage: java DumpXML file.xml");
            Runtime.getRuntime().exit(1);
        }

        IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
        IXMLReader reader = StdXMLReader.fileReader(args[0]);
        parser.setReader(reader);
        XMLElement xml = (XMLElement) parser.parse();

    xml.addChild (null);
    (new XMLWriter(System.out)).write(xml);
    }

}

最佳答案

在我看来,您根本不会编写该Exception。

你只是把它向上扔。尝试抓住它并使用ex.printStackTrace();

除非您另外特别声明,否则这也会导致标准错误。

根据您的请求,我将不更改test0方法,您可以按原样使用它。

AddChild1_wy_v1.java中:

public class AddChild1_wy_v1    {
    public static void main(String args[]) // note that I don't throw the Exception.
    {
      try {
        if (args.length == 0) {
            System.err.println("Usage: java DumpXML file.xml");
            Runtime.getRuntime().exit(1);
        }

        IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
        IXMLReader reader = StdXMLReader.fileReader(args[0]);
        parser.setReader(reader);
        XMLElement xml = (XMLElement) parser.parse();

        xml.addChild (null);
        (new XMLWriter(System.out)).write(xml);
      } catch (Exception any) {
        any.printStackTrace(System.out); // note that I send the Stack Trace to standard out here.
      }
    }
}

关于java - Java-System.setOut不保存异常消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19728294/

10-12 15:23