【沉浸式解决问题】Idea运行Junit测试中scanner无法获取控制台的输入内容

基于Drools规则引擎与状态机构建动态叙事系统:身份决定任务的设计与实现 规则引擎是一种将业务逻辑与应用程序代码分离的软件组件,它通过预定义的规则集对输入数据进行评估和推理,从而自动执行决策或触发动作。其核心原理是基于产生式系统,遵循“条件-动作”模式,当事实满足特定条件时,引擎便执行对应的操作。这种技术价值在于极大地提升了系统的灵活性和可维护性,使复杂、多变的业务逻辑能够被直观地定义和动态调整。在游戏开发、智能决策、业务流程管理等应用场景中,规则引擎是实现动态行为与个性化响应的关键技术。本文聚焦于互动叙事与游戏设计领域,探讨如何利用Drools规则引擎结合有限状态机,构建一个“ 阅读详情

一、问题描述

在微服务项目中写了一些自动构建脚本,其中一个实现了自动在设定的模块名下创建数据库表实体类和mapper,经过测试已经成功了,为了保险起见,在执行创建前加了一个打印文件路径,确认无误后回车继续运行,然后就卡在了这一步。
> 错误
控制台无法输入任何文字,打上断点debug确认是卡在了等待输入的那一步


二、场景还原

1. 测试类

public class CodeGeneratorTest {

    @Test
    void test5() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("子模块目录:" + "");
        System.out.println("请确认以上目录正确,按回车键继续...");
        // 读取一个字符串直到用户按下回车键
        String input = scanner.nextLine();
        if (input.isEmpty()) {
            // 用户按了回车键,继续执行测试
            System.out.println("继续执行测试...");
            // 在这里继续执行你的测试逻辑
        } else {
            System.out.println("输入了额外内容,测试终止");
        }
        // 关闭scanner资源
        scanner.close();
    }
}

三、原因分析

恰巧在此之前,已经有运行成功的了,因为那个脚本比较简单,直接在类中通过main方法中运行了,简化如下:

public class Builder {
    public static void main(String[] args) {
        // 获取当前项目根目录
        String projectRoot = System.getProperty("user.dir");

        Scanner scanner = new Scanner(System.in);
        System.out.println("项目根目录:" + projectRoot);
        System.out.println("请确认以上目录正确,按回车键继续...");
        // 读取一个字符串直到用户按下回车键
        String line = scanner.nextLine();
        // 关闭scanner资源
        scanner.close();
    }
}

简单对比了一下就想到了是运行环境不同,@Test是在Junit测试环境中,搜索问题可以从两个角度:

  • @test时获取不到scanner.nextLine()
  • junit测试如何获取控制台输入
    都找到了许多解决方法,核心的原因就是单元测试从设计的角度讲是自动化的,不应该依赖人工交互,是一个规范问题,idea默认是关闭的,而以前的eclipse是默认开启的
    参考《阿里巴巴Java开发手册》中单元测试章节的内容:

【强制】单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用System.out来进行人肉验证,必须使用assert来验证。
【强制】保持单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试用例之间决不能互相调用,也不能依赖执行的先后次序。
反例:method2需要依赖method1的执行,将执行结果作为method2的输入。
【强制】单元测试是可以重复执行的,不能受到外界环境的影响。
说明:单元测试通常会被放到持续集成中,每次有代码check in时单元测试都会被执行。如果单测对外部环境(网络、服务、中间件等)有依赖,容易导致持续集成机制的不可用。
正例:为了不受外界环境影响,要求设计代码时就把SUT的依赖改成注入,在测试时用spring 这样的DI框架注入一个本地(内存)实现或者Mock实现。


四、解决方案

1. 修改idea配置文件

比较简单便捷的方法是修改idea配置文件,取消这一限制
在idea最上方的菜单栏,点击hepl -> Edit Custom Vm Options
在这里插入图片描述
就会打开idea64.exe.vmoptions配置文件,我这里因为总是打开的类太多就取消后缀名的显示了,在最后一行加上参数:

-Deditable.java.test.console=true

意思就是Java的
在这里插入图片描述
你也可以找到idea的安装目录,打开bin目录,找到idea64.exe.vmoptions文件进行修改也可以,但是要根据idea位数选择对应的文件
在这里插入图片描述
然后重启idea,否则配置不会生效
再测试一下,可以接收控制台内容了
在这里插入图片描述
不过可能对一些版本不生效,我的版本是2019.3.4
在这里插入图片描述

2. 使用main方法

通过配置文件修改是一劳永逸的,但是有可能失败,如果其他人测试也得修改配置,根据原因分析里提到的,也可以直接用main方法执行,但这样就不是单元测试了,只能用于脚本执行

public class CodeGeneratorTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("子模块目录:" + "");
        System.out.println("请确认以上目录正确,按回车键继续...");
        // 读取一个字符串直到用户按下回车键
        String input = scanner.nextLine();
        // 关闭scanner资源
        scanner.close();
    }
}

3. 模拟控制台输入

如果既想测试又不想违背人工干预,只是测试交互该怎么做呢,可以通过模拟控制台输入
利用jdk自带的:System.setIn(InputStream in) 重新分配“标准”输入流,相当于不是从控制台获取数据,而是从该流中获取数据。而对于字符串可以先转为字节数组,然后转成流,ByteArrayInputStream(byte buf[])继承自InputStream,可以作为System.setIn()方法的参数。

public class CodeGeneratorTest {
    @Test
    void test6() {
        System.setIn(new ByteArrayInputStream("hello\n".getBytes()));
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        scanner.close();
        System.out.println(input);
    }
}

在这里插入图片描述

五、参考文献

关于IDEA的junit单元测试Scanner输入不可用的问题(多种原因分析)
JAVA【idea中的@test使用scanner无法从键盘输入的问题】
Java JUnit测试实现控制台输入的正确姿势
用JUnit测试如何自动从控制台输入数据


喜欢的点个关注吧><!祝你永无bug!

/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            佛祖保佑       永无BUG
*/
昇腾910B多卡环境下hccl-test性能调优实战 本文详细介绍了昇腾910B多卡环境下hccl-test性能调优的实战经验,包括环境搭建、CANN工具链配置、性能测试与高级调优技巧。通过优化缓冲区、PCIe拓扑和中断亲和性设置,显著提升多卡通信效率,为AI训练提供稳定高效的计算支持。 阅读详情

相关推荐

Xiaojie雷达之路---毫米波雷达基础知识---角度估计

本篇文章主要介绍毫米波雷达的基础知识中的角度估计,对于本篇文章主要回答5个问题 1.在雷达的前方,如何估计前方一个物体的角度 2.角度测量的准确性 3.如何测量多个物体的角度 4.雷达可测的角度的视场最大值为多少 5.角度分辨率取决于什么因素 文章目录估计雷达前面一个物体的角度角度测量的准确性雷达的最大角视场测量雷达前方多个距离和速度相同的物体角度分辨率角度估计的流程 估计雷达前面一个物体的角度 估计一个物体的角度,最少需要两根接收天线 发射天线发送一个chirp,经过物体发射后信号,信号分别被第一根天

XiaoJie的博客 1万+

解决IDEA中使用junit测试无法使用键盘录入功能(Scanner)

关于IDEA中使用junit里键盘无法录入的问题的解决方案.......

WXS153322的博客 4577

实战教程:用DETR+超分辨率搞定红外小目标检测(附完整代码)

本文提供了一套完整的红外小目标检测实战方案,通过融合EDSR超分辨率技术与改进型DETR深度学习算法,有效解决了红外图像中小目标检测的难题。文章详细介绍了从环境搭建、数据预处理、模型定制(如引入EMA注意力与S2特征层)到训练调优的全流程,并附有完整代码,旨在帮助开发者将前沿算法高效落地于安防、自动驾驶等实际场景。

weixin_29057163的博客 531

IDEA中单元测试使用Scanner控制台无法输入

今天使用IDEA,Junit使用Scanner控制台无法输入,我以为是代码的问题。于是把单元测试换成了main函数,发现控制台可以输入。那么如何解决这个问题呢?在该单元测试运行后,出现了Scanner控制台无法输入的问题。

淅沥的博客 1555

kmeans聚类分析结果怎么看_【Stata与机器学习】物以类聚-KMeans算法应用案例介绍...

古语有云:物以类聚,人以群分。KMeans是无监督机器学习中的聚类算法中最简单的一种——基于特征对样本进行归为不同的类,很好地阐述了‘物以类聚’这句话的精髓。机器学习又叫统计学习。既然都统计了,所以当然包括了计量经济学。所以一般来说,机器学习的算法类型远多于计量经济学。比如线性回归,这个算是机器学习算法中比较基础的部分。当然,计量经济学在回归分析、因果推断方面的造诣,也是普通机器学算法所不能比的。...

weixin_39857480的博客 1万+

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8930

IDEA使用Scanner无法从控制台输入信息

idea使用Scanner无法从控制台输入信息

jhzhong'Blog 1217

保姆级教程:手把手教你从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件(附网址规律总结)

本文提供从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件的详细教程,包括路径解析、版本号确定和下载命令示例。特别解析了GRCh37的特殊存储结构,并分享批量下载、文件校验等高级技巧,帮助生物信息学研究者高效获取基因组注释文件。

weixin_29289821的博客 204

Idea在@Test里使用Scanner在控制台输入

【代码】Idea在@Test里使用Scanner在控制台输入。

weixin_48897289的博客 872

SAP SD信贷管理实战:从配置到风险控制的完整指南(附后台路径)

本文详细解析了SAP SD信贷管理的完整配置流程与风险控制策略,涵盖信贷控制范围设置、风险分级机制及动态控制配置。通过实战案例和后台路径指引,帮助企业实现从客户信用评估到实时监控的全流程管理,有效降低坏账风险并优化资金安全。

3a9bq4r8t2y的博客 212

【最全选型攻略-盘点篇】市面上有哪些靠谱的工业3D相机品牌?(双目、结构光、TOF、激光三角)

选工业3D相机,选最靠谱的品牌,选最Match你的产品,看这一篇就够了!

jiqishijueyingdi的博客 1万+

IDEA中@Test测试时无法通过键盘输入

发现这里是只读模式,无法进行输入。如下所示:(重启一次IEDA)

qq_52648720的博客 701

基于NRF52833芯片的DW3000 SPI驱动接口代码实现

详细介绍基于NRF52833、nRF52820 、nRF52832 nRF52840 芯片的DW3000 硬件驱动接口代码

DT程序员的博客 1215

关于IDEA的junit单元测试Scanner输入不可用的问题

IDEA在Junit测试中使用了Scanner,但是控制台一直转圈,无法输入,eclipse默认可用,其实解决方法很多 这是IDEA的单元测试的默认设置问题 eclipse默认可用 解决方法: 修改IDEA的配置文件,在配置文件中最后一行,加入一条语句 -Deditable.java.test.console=true 添加方法: 方法一:在IDEA里面,点击help->Edit Custom Vm Options… 或者这里: 这样就进入了idea64.exe.vmoptions配置文件,在最

卷NM呢!不干了! 2020

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA中使用单元测试(Junit)Scanner控制台无法输入问题解决 2022.12.13

IDEA中使用Junit单元测试Scanner无法在控制台输入内容解决办法。2022.12.13

孟孟的博客 1587

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA中使用junit测试无法使用键盘录入功能(Scanner),敲击回车会出现This view is read-only(此视图是只读的)该怎么办?

IDEA中使用junit测试无法使用键盘录入功能(Scanner)

m0_58606703的博客 645

JUnit单元测试中不能使用Scanner类的输入功能

1. 前言 今天做网络编程IO练习时,发现一个很神奇的现象,就是单元测试方法不能够使用输入的工具,上代码 @Test public void tes(){ System.out.println("你真棒"); new Scanner(System.in).nextLine(); } 当执行上诉语句时,会发现,程序出现阻塞,但是不能输入 这是IDEA对于测试方法的约束,解决方法可以修改IDEA的配置,或者更改为使用main方法解决 另外有一个奇特的现象,笔者目前还没解决 先上代码 @Tes

weixin_42482333的博客 961

JUnit不能使用Scanner

JUnit不能使用Scanner 和 IO 通过idea工具 Help -> Edit Custom VM Options 打开配置文件 修改配置文件 idea64.exe.vmoptions,在最后一行添加 -Deditable.java.test.console=true 可以解决Scanner问题

qq_36022463的博客 962

idea使用单元测试junit不能使用Scanner

最近由于要单元测试,想用Scanner在junit作为控制台输入。但是却发现junit写了Scanner相关代码后,运行单元测试用例进行debug时,发现项目一直在跑,不停。后来才得知在junit

Mar.三月 560

关于IDEA单元测试中使用Scanner无法输入的解决办法

首先找到菜单栏的Help点击 找到Edit Custom VM Options...点击 往idea64.exe.vmoptionsz这个文件中输入最下面一行的代码 -Deditable.java.test.console=true 然后就可以输入了

qq_55627064的博客 417

解决idea单元测试中无法使用Scanner输入问题_☆往事随風☆的博客

解决idea单元测试中无法使用Scanner输入问题一、解决方法(1)方法一:编辑自定义虚拟机选项(2)方法二:在main方法中进行测试 一、解决方法 (1)方法一:编辑自定义虚拟机选项 依次点击 help —> Edit Custom VM Options… 在 Edit Custom VM Options… 中添加这行代码 -Deditable.java.test.console=true 然后重启 idea 即可在单元测试中使用Scanner输入了 具体操作示意图: (2

☆往事随風☆的博客 2743

idea解决Scanner输入中文乱码,亲测有效

解决idea中 Scanner方法在输入中文时的乱码

qq_51240837的博客 1899

IntelliJ IDEA控制台junit无法使用Scanner输入

解决方法: 在idea64.exe.vmoptions文件最后添加如下内容 -Deditable.java.test.console=true idea64.exe.vmoptions在哪里? 方式一(比较繁琐): IDEA路径下bin文件夹下idea.properties文件中查看 idea.config.path=${user.home}/.IntelliJIdea/conf...

杨杨之余的博客 1260

IDEA使用junit模块进行测试Scanner输入不可用

IDEA使用junit模块进行测试Scanner输入不可用

cj_sun6的博客 847

【Java-IDEA】如何在@Test标签中使用Scanner输入

2.弹出的对话框文件中追加:-Deditable.java.test.console=true。1.使用idea,在导航找到help ->Edit Custom VM Options…

Japathy 408

解决idea使用@Test测试 Scanner无法再控制台输入问题

接下来我们找到idea的bin目录下的idea64.exe.vmoptions,这个配置文件。修改这个文件的配置,添加-Deditable.java.test.console=true。保存后重启idea,就可以在控制台输入了。此时是无法输入信息的。

2303_79615760的博客 413
上一篇: 神舟笔记本Control Center无法打开风扇设置
下一篇: 【转载】MySQL中InnoDB行格式讲解
荔枝吻
博客等级 码龄5年 533粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝吻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值