Почему запись в поток в этом тесте работает в 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.