Есть ли простой способ протестировать (в Junit), если содержимое входного потока равно содержимому выходного?Утверждение InputStream и выходной поток равны
ответ
Во-первых, попытаться преобразовать OutputStream к InputStream, есть интересное объяснение в этом посте: How to convert OutputStream to InputStream?
Когда у вас есть два InputStream, вы можете сравнить, как с помощью кода на:
http://www.java2s.com/Code/Java/File-Input-Output/ComparethecontentsoftwoStreamstodetermineiftheyareequalornot.htm
Не проще сравнивать содержимое двух файлов? – user3727540
Если потоки являются файлами, вы можете использовать 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
Не только нет простого способа проверить это, нет никакого способа сделать это сравнение в общем случае.
- Выходной поток представляет собой абстракцию, которая позволяет реализовать только записи для потоков передачи и забывания. Нет общего способа вернуть то, что было написано.
- Входной поток может не разрешить перемотку. Это не проблема, потому что вы можете быть в порядке с «деструктивными» чтениями, но нужно быть осторожным и в этой области.
Вам необходимо сделать свою собственную обертку вокруг выходного потока, передать ее тестируемой программе и затем собрать то, что было записано в нее. После этого вы можете прочитать свой входной поток и сравнить его контент с тем, что было захвачено.
ByteArrayOutputStream
может помочь вам получить вывод кода, который вы тестируете. Commons IO предоставляют два класса, которые могут быть полезны - TeeInputStream
и TeeOutputStream
.
Нет встроенного способа, но вы все равно сможете его протестировать. Это зависит от того, что вы делаете. Вот простой случай ...
Скажем, если у меня был этот метод ...
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);
}
}
Так что я не тестирование если выходные и входные потоки «равны», но вместо этого я делаю утверждения о том, что на самом деле делает метод.
Надеюсь, это поможет.
Мне не хватает контекста. Можете ли вы поделиться кодом (или, по крайней мере, подписи) метода, который вы пытаетесь проверить? – Mureinik
Собираетесь ли вы писать * UnitTest * s (в отличие от записи * приемочного/отклоняющего теста * s с использованием JUnitFramework)? Если вы сначала замените Input/OutputStream на Mocks (используя Mokito или аналогичный), вы можете проверить, что то, что вы настроили для возврата IS, переносится в ОС ... –
Позвольте мне объяснить, что я здесь делаю: I получила функцию, которая сортирует данные, поступающие из входного потока (данные XML) и записывает результат в предоставленный выходной поток. Я хотел бы проверить, соответствует ли полученное содержимое выходного потока (записанному в файле) ожидаемому содержимому файла. – user3727540