java – 你如何模拟输出流?

前端之家收集整理的这篇文章主要介绍了java – 你如何模拟输出流?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通过’输出蒸汽’我的意思是任何接收字节序列或任何字符的对象.所以,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的问题.

那么我怎么用这个模拟呢?

我使用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相关文章