我试图使用Console类来获取用户的输入,但是当我调用时会返回一个null对象System.console().在使用System.console之前,我是否必须更改任何内容?
Console co=System.console();
System.out.println(co);
try{
String s=co.readLine();
}
Run Code Online (Sandbox Code Playgroud) 理想情况下,我想编写JUnit测试代码,以交互方式测试学生基于文本的I/O应用程序.使用System.setIn()/ .setOut()导致问题,因为底层流阻塞.Birkner的系统规则(http://www.stefan-birkner.de/system-rules/index.html)在之前的文章(基于测试控制台的应用程序/程序 - Java)中被推荐,但似乎需要所有标准输入在单元测试目标运行之前提供,因此不是交互式的.
要提供具体的测试目标示例,请考虑以下猜测游戏代码:
public static void guessingGame() {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int secret = random.nextInt(100) + 1;
System.out.println("I'm thinking of a number from 1 to 100.");
int guess = 0;
while (guess != secret) {
System.out.print("Your guess? ");
guess = scanner.nextInt();
final String[] responses = {"Higher.", "Correct!", "Lower."};
System.out.println(responses[1 + new Integer(guess).compareTo(secret)]);
}
}
Run Code Online (Sandbox Code Playgroud)
现在想象一下JUnit测试,它将提供猜测,阅读响应以及完成游戏.如何在JUnit测试框架中实现这一目标?
回答:
使用下面Andrew Charneski推荐的方法,添加输出刷新(包括System.out.flush();在上面的每个打印语句之后添加),非随机播放和System.in/out的恢复,这段代码似乎执行我想象的测试:
@Test
public void guessingGameTest() …Run Code Online (Sandbox Code Playgroud) 这些测试应该在构建 jar 文件后运行。他们应该测试它是否完全运行,以及它是否在给定某些输入文件的情况下产生正确的控制台输出。
您能否指出一些针对控制台应用程序进行此类测试的示例?这些测试是否必须用 Java 编写才能与 Maven 一起使用?
有一个类似的问题(基于测试控制台的应用程序/程序 - Java)但我需要的是黑盒测试,而不是单元测试。它没有提到Maven。
更新:
事实证明,这非常容易做到。我的第一个问题是在这里看到这么多定义后对集成测试的误解(什么是单元测试、集成测试、烟雾测试、回归测试?;单元测试、功能测试、验收测试和集成测试之间有什么区别?;什么是单元测试和集成测试,以及我应该了解哪些其他类型的测试?;到底什么是集成测试?)。第二个问题是我不打算用Java写这些测试,但最终我不得不学习如何使用java.lang.Runtime.
首先,我已将此添加到我的pom.xml 中:
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
然后我在src/test/java 中创建了一个*IT.java文件:
public class MyAppIT {
@Test
public void test() throws IOException {
Runtime runtime = Runtime.getRuntime();
String cmd = "java -cp target/myapp.jar my.app.Main";
Process process = runtime.exec(cmd);
InputStreamReader isr = …Run Code Online (Sandbox Code Playgroud)