java - 测试从 stdin 读取并写入 stdout 的 java 程序

标签 java junit mocking

我正在为 Java 编程竞赛编写一些代码。程序的输入是使用 stdin 给出的,输出是在 stdout 上。你们如何测试在 stdin/stdout 上运行的程序?这就是我的想法:

由于 System.in 是 InputStream 类型,而 System.out 是 PrintStream 类型,我用这个原型(prototype)在 func 中编写了我的代码:

void printAverage(InputStream in, PrintStream out)

现在,我想使用 junit 对此进行测试。我想使用字符串伪造 System.in 并接收字符串中的输出。

@Test
void testPrintAverage() {

    String input="10 20 30";
    String expectedOutput="20";

    InputStream in = getInputStreamFromString(input);
    PrintStream out = getPrintStreamForString();

    printAverage(in, out);

    assertEquals(expectedOutput, out.toString());
}

实现 getInputStreamFromString() 和 getPrintStreamForString() 的“正确”方法是什么?

我是否让事情变得比需要的更复杂?

最佳答案

尝试以下操作:

String string = "aaa";
InputStream stringStream = new java.io.ByteArrayInputStream(string.getBytes())

stringStream 是一个将从输入字符串中读取字符的流。

OutputStream outputStream = new java.io.ByteArrayOutputStream();
PrintStream printStream = new PrintStream(outputStream);
// .. writes to printWriter and flush() at the end.
String result = outputStream.toString()

printStream 是一个 PrintStream,它将写入 outputStream,而后者又能够返回一个字符串。

关于java - 测试从 stdin 读取并写入 stdout 的 java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329282/

相关文章:

eclipse - 将 Jmockit 与 Eclemma 结合使用

java - Mockito 和 ReloadableResourceBundleMessageSource 不能很好地结合在一起吗?

c++ - 模拟对象 C++

java - 如何从 Maven 3.0 插件获取本地存储库位置?

java - 在 Android 中以自定义格式显示相对日期

java - Android 中的 HSVToColor 有点奇怪

java - AspectJ 不是在测试编译时编织而是在编译时编织。因此,单元测试在使用 Maven 运行时会抛出 ClassNotFoundException

wpf - 如何模拟 DragEventArgs

java - Mockito实体管理器返回namedQuery

java - JVM是否将字节码解释为汇编语言