gpt4 book ai didi

java - 你如何模拟输出流?

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:09 25 4
gpt4 key购买 nike

“输出流”是指任何接收字节序列、字符序列或其他任何对象的对象。所以,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com