2016-12-31 6 views
2

Есть ли простой способ протестировать (в Junit), если содержимое входного потока равно содержимому выходного?Утверждение InputStream и выходной поток равны

+2

Мне не хватает контекста. Можете ли вы поделиться кодом (или, по крайней мере, подписи) метода, который вы пытаетесь проверить? – Mureinik

+0

Собираетесь ли вы писать * UnitTest * s (в отличие от записи * приемочного/отклоняющего теста * s с использованием JUnitFramework)? Если вы сначала замените Input/OutputStream на Mocks (используя Mokito или аналогичный), вы можете проверить, что то, что вы настроили для возврата IS, переносится в ОС ... –

+0

Позвольте мне объяснить, что я здесь делаю: I получила функцию, которая сортирует данные, поступающие из входного потока (данные XML) и записывает результат в предоставленный выходной поток. Я хотел бы проверить, соответствует ли полученное содержимое выходного потока (записанному в файле) ожидаемому содержимому файла. – user3727540

ответ

0

Во-первых, попытаться преобразовать OutputStream к InputStream, есть интересное объяснение в этом посте: How to convert OutputStream to InputStream?

Когда у вас есть два InputStream, вы можете сравнить, как с помощью кода на:

http://www.java2s.com/Code/Java/File-Input-Output/ComparethecontentsoftwoStreamstodetermineiftheyareequalornot.htm 
+0

Не проще сравнивать содержимое двух файлов? – user3727540

+0

Если потоки являются файлами, вы можете использовать commons-io FileUtils.contentEquals [https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils. HTML # contentEquals (java.io.File,% 20java.io.File)] – rbv

0

Не только нет простого способа проверить это, нет никакого способа сделать это сравнение в общем случае.

  • Выходной поток представляет собой абстракцию, которая позволяет реализовать только записи для потоков передачи и забывания. Нет общего способа вернуть то, что было написано.
  • Входной поток может не разрешить перемотку. Это не проблема, потому что вы можете быть в порядке с «деструктивными» чтениями, но нужно быть осторожным и в этой области.

Вам необходимо сделать свою собственную обертку вокруг выходного потока, передать ее тестируемой программе и затем собрать то, что было записано в нее. После этого вы можете прочитать свой входной поток и сравнить его контент с тем, что было захвачено.

ByteArrayOutputStream может помочь вам получить вывод кода, который вы тестируете. Commons IO предоставляют два класса, которые могут быть полезны - TeeInputStream и TeeOutputStream.

0

Нет встроенного способа, но вы все равно сможете его протестировать. Это зависит от того, что вы делаете. Вот простой случай ...

Скажем, если у меня был этот метод ...

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import org.springframework.util.StreamUtils; 

public class Stack { 

    public static void copy(InputStream in, OutputStream out) { 
     try { 
      StreamUtils.copy(in, out); 
     } catch(IOException io) { 
      throw new RuntimeException("BOOM!"); 
     } 
    } 
} 

я мог проверить этот метод, как это ...

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.util.Arrays; 

import org.junit.Test; 

public class StackTest { 

    @Test 
    public void shouldCopyFromInputToOutput() { 
     byte[] contents = new byte[] { 1, 2, 3 }; 

     ByteArrayOutputStream out = new ByteArrayOutputStream(); 

     Stack.copy(new ByteArrayInputStream(contents), out); 

     byte[] written = out.toByteArray(); 

     assert Arrays.equals(contents, written); 
    } 
} 

Так что я не тестирование если выходные и входные потоки «равны», но вместо этого я делаю утверждения о том, что на самом деле делает метод.

Надеюсь, это поможет.