java重定向系统。在ByteArrayInputStream中,读取一个JUnit测试太晚了
我目前正在为学生任务的自动测试编写Junit测试。主题是java中的控制台输入。我有多个测试需要模拟用户输入,并检查测试方法的正确行为(该方法工作正常)
目前我的问题是:设置为System.in
的ByteArrayInputStream不会在需要时发布,而是在稍后进行一次测试(请参见下面的图片)
我尝试重置流,使其静态,使其非静态,在前后设置标准System.in
,尝试读取方法,切换java版本(从SE13到1.8)。不同时间的所有尝试,ofc
图片中的输出说明:
它来自我们的自动化JUnit框架。这两个测试依赖于接受用户输入的测试方法。那个“?”在一行的开始处,表示测试方法处于活动状态且正在等待。开始测试线后的前两个单词是应该注射的
JUnit测试代码:
final static InputStream STDIN = System.in;
static ByteArrayInputStream bais;
final static String[] INJECTIONS = { "abc", "def", "ghi", "jkl", "mmmm", "klopp", "urgl", "gurle", "ding", "dong" };
private static void inject(String injection, Object o, MethodSignature ms) {
System.out.println(injection);
try {
ByteArrayInputStream bais = new ByteArrayInputStream(injection.getBytes("UTF-8"));
System.setIn(bais);
System.out.println("Injection Bytes: "+injection.getBytes().length);
System.out.println("Available for injection: " + System.in.available());
ms.getMethod().invoke(o);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.setIn(STDIN);
}
}
private static String getStringInject(String injection, Object o, MethodSignature ms) {
String out = null;
System.out.println(injection);
try {
ByteArrayInputStream bais = new ByteArrayInputStream(injection.getBytes("UTF-8"));
System.setIn(bais);
System.out.println("Injection Bytes: "+injection.getBytes().length);
System.out.println("Available for injection: " + System.in.available());
System.in.reset();
out = (String) ms.getMethod().invoke(o);
} catch (Exception e) {
e.printStackTrace();
}
finally {
System.setIn(STDIN);
}
return out;
}
@Test
public void checkReadFromConsoleCorrectReturnTest() {
Object o = createObject(csMain.getC());
if (o == null) {
addFail(csMain.getObjectFail());
return;
}
String injection = INJECTIONS[ThreadLocalRandom.current().nextInt(0, INJECTIONS.length)];
String output = getStringInject(injection + System.lineSeparator() + "END" + System.lineSeparator(), o,
msReadFromConsole);
if (output == null || output.isEmpty()) {
addFail(msReadFromConsole.getMethodNoReturnString());
return;
}
}
@Test
public void checkReadCorrectEndingTriggerTest() {
Object o = createObject(csMain.getC());
if (o == null) {
addFail(csMain.getObjectFail());
return;
}
String injection = INJECTIONS[ThreadLocalRandom.current().nextInt(0, INJECTIONS.length)]
+ System.lineSeparator() + "END" + System.lineSeparator();
inject(injection, o, msRead);
}
测试过的java方法:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class ConsoleReader implements IConsoleReader {
ArrayList<String> reads;
BufferedReader br;
public ConsoleReader() {
reads = new ArrayList<String>();
br = new BufferedReader(new InputStreamReader(System.in));
}
public void read() {
String input = readFromConsole();
while (true) {
if (input == null || input.isEmpty()) {
System.out.println("ERROR: null");
return;
}
input = input.trim().toUpperCase();
if (input.equals("END")) {
System.out.println("Done.");
return;
}
reads.add(input);
input = readFromConsole();
}
}
public String readFromConsole() {
System.out.print("? ");
String out = null;
try {
out = br.readLine();
} catch (Exception e) {
e.printStackTrace();
return null;
}
System.out.println(out);
return out;
}
}
非常感谢你的帮助。无法更改使用的Junit库或添加其他外部库
# 1 楼答案
我编写了以下代码片段供您运行:
如您所见,流中的
BufferedReader
已正确就绪"test"
。我使用ByteArrayInputStream
的AutoClosable
方面在代码块之后关闭它因为这并不能解决您的问题,所以我不确定问题是否源自周围的框架。更具体地说,我能想到的关于从TestCase1到TestCase2的值跳跃的唯一解释是,对象不是重新实例化的,而是以某种方式重用的。由于该代码缺失,因此无法确定