java - 如何使用 IOUtils.toInputStream 为 InputStream 提供一个空行

标签 java unit-testing io

我的代码通过 Scanner 消耗 InputStream ,看起来像

String input = scanner.nextLine().toLowerCase();
if (input.isEmpty()) {
    return defaultAnswer;
} else if (input.startsWith("y")) {
    return true;
} else if (input.startsWith("n")) {
    return false;
}

其中扫描器由来自 IOUtils.toInputStream("someString") 的给定 InputStream 初始化。

如何测试 if (input.isEmpty()) 路径?

编辑:

我交换了代码中的两行,空字符串 ("") 导致 NoSuchElementException,换行符或回车符导致返回空字符串.

最佳答案

使用 IOUtils.toInputStream("")new ByteArrayInputStream(new byte[0])可能有效。

后者肯定会提供一个空流,但它可能会使您的代码失败,因为没有空行可供读取 - 没有行终止符。例如:

import java.io.*;
import java.util.*;

public class Test {

    public static void main(String[] args) {
        InputStream stream = new ByteArrayInputStream(new byte[0]);
        Scanner scanner = new Scanner(stream, "UTF-8");
        String line = scanner.nextLine();
        System.out.println(line);
    }    
}

失败的原因是:

Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.util.Scanner.nextLine(Unknown Source)
        at Test.main(Test.java:10)

您可以使用Scanner.hasNextLine()检查是否调用nextLine()是否合适。您可能希望在代码中执行此操作。这实际上取决于您是否尝试建模“输入结束时没有一行”或“用户输入了空行”。这些情况截然不同,您应该考虑这两种情况。

如果您想提供包含换行符的流(即“用户输入空行”),那么您可能需要使用 IOUtils.toInputStream("\n")反而。我很紧张,因为它没有指定 Charset不过 - 您应该仔细考虑您期望输入采用的编码。

关于java - 如何使用 IOUtils.toInputStream 为 InputStream 提供一个空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24817450/

相关文章:

python - 如何在 flask 项目中运行单元测试?

c# - 使用 Topshelf 进行集成测试以启动 C# Windows 服务

windows - 为什么另一个线程中的阻塞 IO 会阻止 CreateWindowEx() 返回

java - 在hibernate中使用主键和外键组合映射三个表

java - WSO2 - svnClientBundle.jar 在不活动后进入休眠状态并且不恢复功能

javascript - 如何确定 Controller 在angularJS的全局命名空间上可用

c++ - 尽可能快地读取标准输入

检查非阻塞发送是否成功

java - 迭代反射的子类,变量似乎没有阴影,IntelliJ 似乎有冲突

Java-ArrayIndexOutOfBoundsException 错误