java - 你如何模拟输出流?

标签 java stream mocking outputstream

“输出流”是指任何接收字节序列、字符序列或其他任何对象的对象。所以,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用于模拟,但我有兴趣了解任何模拟库的方法。

最佳答案

测试输出或输入流的一个相当优雅的策略是使用 PipedInputStreamPipedOutputStream 类。您可以在测试设置中将它们连接在一起,然后在执行目标方法后检查已写入的内容。

您可以从另一个方向开始准备一些输入,然后让测试也从输入流中读取准备好的数据。

在您的情况下,您可以使用 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/

相关文章:

Java 准备好的语句不起作用?

java - 如果 compareTo() 返回 0,为什么暗示对象相等?

iphone - 将视频从 iPhone 或 Android 流式传输到 RTMP

java.io.NotSerializedException : java. lang.reflect.Constructor

python - 我可以在测试用例中为我的函数模拟输入吗?

python - 无法在 Windows 上使用 Python 模拟操作系统名称

java - Spring 4.1.5.RELEASE 中的 ResourceUrlEncodingFilter 启用了 springSecurityFilterChain

java - 从 stdin 读取多字字符串

c# - 在静态方法中管理一次性对象

compilation - 使用抽象基类引用在 google mock 中调用函数会给出 num arguments 错误