如何对以下方法进行单元测试?
public static String grabString() {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
do {
try {
// call the readline method of the buffered reader object.
return r.readLine();
} catch (Exception e) {
}
} while (true);}
如果我像这样从测试类调用这个方法
String getInput = grabString();
并测试它
assertEquals(getInput, "hello");
是否可以使用代码在控制台中输入“hello”而不需要打字,以便单元测试立即运行?
最佳答案
我建议您不要使用静态方法,而是使用一个带有 InputStream 作为字段的对象(最终是单例)。 然后您可以在生产代码中使用真实的 System.in 并在测试中使用虚假的 InputStream。
类似这样的事情:
public class MyStreamReader {
private InputStream in;
public MyStreamReader(InputStream in) {
this.in = in;
}
public String grabString() {
BufferedReader r = new BufferedReader(new InputStreamReader(in));
do {
try {
// call the readline method of the buffered reader object.
return r.readLine();
} catch (Exception e) {
}
} while (true);
}
}
在生产代码中,您将使用 System.in 流构造实例(例如 new MyStreamReader(System.in)
)。
在测试中,您将使用假输入流进行测试:
@Test
public void testGrabString() throws Exception {
String expected = "test input from console";
ByteArrayInputStream fakeIS = new ByteArrayInputStream(expected.getBytes());
MyStreamReader myStreamReader = new MyStreamReader(fakeIS);
String actual = myStreamReader.grabString();
assertEquals(expected, actual);
}
关于java - Java 控制台输入法的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577481/