gpt4 book ai didi

Java 测试扫描仪与假用户输入

转载 作者:行者123 更新时间:2023-12-01 17:48:14 25 4
gpt4 key购买 nike

我有一个 static 方法,它使用 static Final Scanner 从控制台获取用户输入。

在测试时,我想创建多个具有不同输入的测试(显然)。只要单独运行测试,这种方法就可以正常工作。运行整个类不起作用,因为(显然)扫描仪已经使用上一个测试的输入进行了初始化,其中没有比第一个测试所需的行数更多的行。

我收到的具体错误是:

java.util.NoSuchElementException: No line found

这里有一些用于澄清的代码:

public class UserInputHandler {
public static final Scanner SCANNER = new Scanner(System.in);
}

我试图测试的类(以及其他一些类)正在使用上面的 Scanner 来查询用户。

我的测试:

InputStream in = new ByteArrayInputStream("test".getBytes());
System.setIn(in);
TestClass testclass = new TestClass();
testClass.method(); // Scanner is used in this method

如何让我的测试适用于多个 TestClass 实例?

最佳答案

真正的问题在这里:

public class UserInputHandler {
public static final Scanner SCANNER = new Scanner(System.in);
}

强制该输入来自System.in。为什么不使用

public class UserInputHandler {
public Scanner getScanner() {
return new Scanner(someInputStream);

当然,现在您必须担心 someInputStream 来自哪里,但是:您使自己变得更加灵活。

您的代码实际上并不是在单个静态对象上,而是进行调用并接收从某个地方读取的数据。然后,在测试中,您只需定义输入流,并确保可以使用这些输入流(例如,将其作为 UserInputHandler 类的一个字段,在实例化该类时设置该字段。

换句话来说:真正的解决方案是更改您的生产代码,使其 A) 更加灵活,B) 易于测试。你把事情搞反了:你编写了不灵活且难以测试的代码,现在你试图使你的测试用例变得合理。

错误的方法:当您无法编写简单、直接的测试时,您的生产代码就需要重新编写。永远。

关于Java 测试扫描仪与假用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963512/

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