如何在Maven测试中从标准输入(stdin)读取数据?
Maven测试中Java读取stdin挂起的解决办法
你的问题本质是Maven默认的Surefire测试插件会把测试进程的标准输入重定向到空设备(Linux是/dev/null,Windows是NUL),导致终端输入根本传不到测试代码里,自然会一直挂着等待输入。
解决方法分两种:
临时快速解决
直接在运行测试时加参数,让Surefire不拦截标准输入:
mvn test -Dsurefire.useSystemIn=true
如果是比较老的Surefire版本(2.x系列),用这个参数:
mvn test -DforkMode=never
永久配置(推荐)
在项目的pom.xml里修改Surefire插件的配置,一劳永逸:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <!-- 替换成你项目实际使用的插件版本 --> <configuration> <useSystemIn>true</useSystemIn> </configuration> </plugin> </plugins> </build>
额外建议
如果你的测试是要自动化运行的,依赖手动输入stdin其实不太合适——毕竟自动化测试应该不需要人工干预。可以把测试输入内容提前写到资源文件里,比如src/test/resources/test-input.txt,然后测试代码读取这个文件:
try (Scanner scanner = new Scanner(Objects.requireNonNull(getClass().getResourceAsStream("/test-input.txt")))) { String input = scanner.nextLine(); // 后续逻辑 }
内容的提问来源于stack exchange,提问作者C0urante
相关产品推荐
相关产品推荐

