IDEA使用Junit时不能从控制台输入解决方法

博主从eclipse转IDEA后,写单元测试时发现@Test无法从控制台输入数据,很多博客称是junit与IDEA版本不兼容,用main方法可解决。博主参考大神博客,通过在IDEA安装根目录bin文件夹下的两个文件添加参数 -Deditable.java.test.console=true,重启IDEA解决了问题。
  • IDEA版本:2018.3.3
  • JDK版本:1.8
  • Junit版本:4.11

最近从eclipse转IDEA,今天使用IDEA写一个单元测试的时候,发现@Test从控制台不能输入数据,这种情况我用eclipse是没出现过的,我也找到了好多博客,说是junit的版本与IDEA的不兼容,改成用main方法写就可以解决了,但是,我找到了另外一个大神的博客,只需要添加一个参数就可以解决。

参考博客地址:https://blog.youkuaiyun.com/u010999809/article/details/88733014

  1. 首先,打开IDEA安装根目录下的bin文件夹,找到idea.exe.vmoptionsidea64.exe.vmoptions这两个文件
  2. 对这两个文件进行编辑,在后面添加一段参数-Deditable.java.test.console=true
  3. 重启IDEA,就可以在@Test下,使用Scanner从控制台输入了

 

使用 IntelliJ IDEA 运行 Java 程序,如果遇到 `Scanner` 输入阻塞、无法输入文字的情况,这通常与运行环境或测试框架的交互方式有关。以下是可能导致此问题的原因及解决方案: ### 1. 在 JUnit 测试中使用 Scanner 输入 如果在 JUnit 测试方法使用 `Scanner` 接收用户输入,会因 JUnit控制台交互限制而导致程序卡住[^2]。JUnit 并不支持标准输入流的交互式读取,因此 `scanner.nextLine()` 将无限等待输入。 **解决方案:** - **避免在 JUnit 测试中直接使用 `Scanner` 读取用户输入**。可以将输入逻辑移至主程序中,通过 `main` 方法运行。 - 如果需要模拟输入数据,可使用 `System.setIn()` 方法重定向输入流,例如从字符串或文件中读取预定义的输入内容: ```java @Test public void testScannerWithMockInput() { String input = "Hello, World!"; InputStream in = new ByteArrayInputStream(input.getBytes()); System.setIn(in); Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); scanner.close(); assertEquals("Hello, World!", s); } ``` ### 2. 控制台未正确连接 有,在某些运行配置下,IDEA控制台可能未正确绑定到标准输入流(例如远程调试或特定插件环境下),导致无法接收键盘输入。 **解决方案:** - **确保运行配置使用本地 JVM 启动**,并在 IDEA 的 Run 面板中打开控制台窗口。 - **检查是否启用了“Single instance only”设置**,该设置可能导致控制台输入失效。 - **尝试重启 IDEA 或重置其配置**,以排除缓存或插件冲突问题。 ### 3. 输入流被其他线程或资源占用 由于 `Scanner` 使用的是 `System.in`,若其他线程或组件已占用该输入流,也会导致阻塞。 **解决方案:** - **确保没有多个 `Scanner` 实例同读取 `System.in`**,建议在整个程序中只创建一个 `Scanner` 实例,并在使用完毕后及关闭。 - **避免在多线程环境中并发访问 `Scanner` 对象**,应通过同步机制或线程局部变量进行隔离。 ### 4. 操作系统或终端设置问题 在某些操作系统或终端模拟器中,可能存在输入缓冲区处理异常的问题,尤其是在远程开发或容器环境中。 **解决方案:** - **尝试在 Windows 上使用 CMD 或 PowerShell 直接运行程序**,确认是否为 IDEA 特有的问题。 - **检查是否启用了特殊终端特性(如伪终端或输入过滤)**,关闭相关设置或更换终端模拟器。 ### 示例代码:安全使用 Scanner ```java public class SafeScannerUsage { public static void main(String[] args) { try (Scanner scanner = new Scanner(System.in)) { System.out.println("请输入数据:"); String str = scanner.nextLine(); System.out.println("输出的内容为:" + str); } catch (Exception e) { System.err.println("发生异常:" + e.getMessage()); } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值