通过’输出蒸汽’我的意思是任何接收字节序列或任何字符的对象.所以,java.io.OutputStream,还有java.io.Writer,javax.xml.stream.
XMLStreamWriter的writeCharacters方法等等.
我正在为一个类编写基于模拟的测试,其主要功能是将数据流写入其中之一(XMLStreamWriter,因为它发生).
问题是数据流是写入一系列对write方法的调用,但重要的不是调用,而是数据.例如,给出一个XMLStreamWriter,这些:
out.writeCharacters("Hello,"); out.writeCharacters("world!");
相当于此:
out.writeCharacters("Hello,world!");
真的没关系(为了我的目的)发生.会有一些特定的调用顺序,但是我不在乎它是什么,所以我不想写这个特定顺序的期望.我只是希望能够以某种方式写出一定数量的数据.
一个选择是切换到基于状态的测试.我可以在缓冲区中累积数据,并对其进行断言.但是,由于我正在编写XML,这意味着要做一些比较复杂和丑陋的断言.嘲笑似乎是一个更好的方式来处理更大的编写XML的问题.
那么我怎么用这个模拟呢?
解决方法
测试输出或输入流的一个相当优雅的策略是使用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()); }