Почему запись в поток в этом тесте работает в IntelliJ "Run", а не когда я использую Maven "test"?

В моем приложении у меня есть проблема, когда OutputStream ничего не записывает в файл, когда я запускаю "mvn clean test", но когда я запускаю его в IntelliJ, щелкнув правой кнопкой мыши по запуску testWritingToFile(), он работает нормально и выводит в файл.

У меня есть следующий тест:

@Test
public void testWritingToFile() throws Exception {
    File fileXml = new File("xmltest.xml");
    OutputStream outputStream = new FileOutputStream(fileXml);
    XmlStreamWriting xmlStreamWriting = new XmlStreamWriting(outputStream);

    xmlStreamWriting.writeXmlToStream();

    outputStream.close();

}

Вот класс, который я вызываю из теста (XmlStreamWriting.java):

public class XmlStreamWriting extends XmlStreamWritingBase {
    public XmlStreamWriting(OutputStream outputStream) {
        this.setOutputStream(outputStream);
    }

    public void writeXmlToStream() throws XMLStreamException {
        XMLStreamWriter xmlStreamWriter = this.getXmlStreamWriter();
        xmlStreamWriter.writeStartElement("test");
        xmlStreamWriter.writeCharacters("This is a test.");
        xmlStreamWriter.writeEndElement(); //test
    }
}

А вот абстрактный класс, который он расширяет (XmlStreamWritingBase.java):

public abstract class XmlStreamWritingBase {
    private XMLStreamWriter xmlStreamWriterPrivate;
    private OutputStream outputStream;

    public XMLStreamWriter getXmlStreamWriter() throws XMLStreamException {
        if(xmlStreamWriterPrivate == null) {
            XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
            xmlStreamWriterPrivate = xmlOutputFactory.createXMLStreamWriter(this.getOutputStream());
        }
        return this.xmlStreamWriterPrivate;
    }

    public OutputStream getOutputStream() {
        return outputStream;
    }

    public void setOutputStream(OutputStream outputStream) {
        this.outputStream = outputStream;
    }
}

Я использую jrockit jdk 1.6.0_29, если это имеет значение. И IntelliJ, и Maven настроены для запуска этого JDK.

Должен ли я сдать OutputStream к каждому методу напрямую? Почему не writeXmlToStream() метод работы?

РЕДАКТИРОВАТЬ: Также просто чтобы убедиться, что поток работает в обоих случаях, я изменил тест на это, и когда я запускаю из maven, между Test1 и Test2 нет содержимого, но когда я запускаю с IntelliJ, между двумя строками появляется xml.

public void testWritingToFile() throws Exception {
    File fileXml = new File("xmltest.xml");
    OutputStream outputStream = new FileOutputStream(fileXml);

    outputStream.write("Test1".getBytes());

    XmlStreamWriting xmlStreamWriting = new XmlStreamWriting(outputStream);

    xmlStreamWriting.writeXmlToStream();

    outputStream.write("Test2".getBytes());

    outputStream.close();
}

Выход для Maven это "Test1Test2", вывод для IntelliJ "Run"есть"Test1<test>This is a test.</test>Test2"

1 ответ

Решение

Решение состояло в том, что я не устанавливал тип кодировки. Или они отличались как-то. Когда я устанавливаю кодировку UTF-8, файл записывается очень хорошо:

xmlOutputFactory.createXMLStreamWriter(this.getOutputStream(), "UTF-8");

Я обнаружил это, потому что когда я ставил maven цель в IntelliJ, переключатель -Dfile.encoding=UTF-8 будет добавлен в конец команды mvn, а затем тест правильно построит файл XML.

Другие вопросы по тегам