Тестирование того, что написано на Java OutputStream

Я собираюсь написать тесты junit для XML-синтаксического разбора Java-класса, который выводит непосредственно на OutputStream. Например, xmlWriter.writeString("foo"); создаст что-то вроде <aTag>foo</aTag> для записи в выходной поток, хранящийся внутри экземпляра XmlWriter. Вопрос в том, как проверить это поведение. Разумеется, одним из решений было бы позволить OutputStream быть FileOutputStream, а затем читать результаты, открывая записанный файл, но он не очень изящный.

Ответ 1

Используйте ByteArrayOutputStream, а затем получите данные из этого, используя toByteArray(). Это не будет проверять, как оно записывается в поток (по одному байту за раз или в виде большого буфера), но, как правило, вам все равно не нужно это делать.

Ответ 2

Если вы можете передать Writer в XmlWriter, я передам ему StringWriter. Вы можете запросить содержимое StringWriter, используя toString() на нем.

Если вам нужно передать OutputStream, вы можете передать ByteArrayOutputStream, и вы также можете вызвать toString() на нем, чтобы получить его содержимое как строку.

Затем вы можете закодировать что-то вроде:

public void testSomething()
{
  Writer sw = new StringWriter();
  XmlWriter xw = new XmlWriter(sw);
  ...
  xw.writeString("foo");
  ...
  assertEquals("...<aTag>foo</aTag>...", sw.toString());
}

Ответ 3

Это просто. Как сказал @JonSkeet:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
// pass the baos to be writed with "value", for this example
byte[] byteArray = baos.toByteArray();
Assert.assertEquals("value", new String(byteArray));