“输出流”是指任何接收字节序列、字符序列或其他任何对象的对象。所以,java.io.OutputStream,还有java.io.Writer,javax.xml.stream.XMLStreamWriter的writeCharacters方法等等。
我正在为一个类编写基于模拟的测试,该类的主要功能是将数据流写入其中一个(碰巧是 XMLStreamWriter)。
问题在于,数据流是在对 write 方法的一系列调用中写入的,但重要的不是调用,而是数据。例如,给定一个 XMLStreamWriter out
,这些:
out.writeCharacters("Hello, ");
out.writeCharacters("world!");
等同于:
out.writeCharacters("Hello, world!");
发生什么事(对我而言)真的无关紧要。会有一些特定的调用顺序,但我不在乎它是什么,所以我不想为那个特定的顺序编写期望。我只是希望以任何方式写入特定的数据流。
一种选择是切换到基于状态的测试。我可以将数据累积在缓冲区中,并对其进行断言。但是因为我正在编写 XML,所以这意味着要进行一些相当复杂和丑陋的断言。模拟似乎是处理编写 XML 的更大问题的更好方法。
那么我该如何使用模拟来做到这一点?
我正在使用 Moxie用于模拟,但我有兴趣了解任何模拟库的方法。
最佳答案
测试输出或输入流的一个相当优雅的策略是使用 PipedInputStream 和 PipedOutputStream 类。您可以在测试设置中将它们连接在一起,然后在执行目标方法后检查已写入的内容。
您可以从另一个方向开始准备一些输入,然后让测试也从输入流中读取准备好的数据。
在您的情况下,您可以使用 PipedOutputStream 模拟那个 "out" 变量,然后以这种方式将 PipedInputStream 插入它:
private BufferedReader reader;
@Before
public void init() throws IOException {
PipedInputStream pipeInput = new PipedInputStream();
reader = new BufferedReader(
new InputStreamReader(pipeInput));
BufferedOutputStream out = new BufferedOutputStream(
new PipedOutputStream(pipeInput))));
//Here you will have to mock the output somehow inside your
//target object.
targetObject.setOutputStream (out);
}
@Test
public test() {
//Invoke the target method
targetObject.targetMethod();
//Check that the correct data has been written correctly in
//the output stream reading it from the plugged input stream
Assert.assertEquals("something you expects", reader.readLine());
}
关于java - 你如何模拟输出流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392946/