我正在创建JUnit并测试以下方法:
public static String readLine() throws IOException{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
return stdin.readLine();
}
我想提前在JUnit测试方法中输入字符串,而不是在readLine()中通过在我自己的控制台中获取inputput来实现。
我该怎么做?
答案 0 :(得分:1)
您可以使用Mockito之类的东西来模拟输入流。但是没有这个也可以做到。使用System.setIn()
,您可以更改System.in
将返回的流。
public class ReaderTest {
@Test
public void test() throws IOException {
String example = "some input line"; //the line we will try to read
InputStream stream = new ByteArrayInputStream((example+"\n").getBytes(StandardCharsets.UTF_8)); //this stream will output the example string
InputStream stdin = System.in; //save the standard in to restore it later
System.setIn(stream); //set the standard in to the mocked stream
assertEquals(example, Reader.readLine()); //check if the method works
System.setIn(stdin);//restore the stardard in
}
}
class Reader{
public static String readLine() throws IOException{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
return stdin.readLine();
}
}
模拟流的另一个好处是,每次要运行测试时都不必再输入String。
另请注意,如果您计划执行此操作,则可以在before和after方法中恢复System.in
。
答案 1 :(得分:0)
模拟该类,然后使用when,然后返回返回输入而不是从控制台获取输入。
下面给出了一个例子,
@Test
public void readLine() throws Exception {
BufferedReader bufferedReader = org.mockito.Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("line1", "line2", "line3");
}
答案 2 :(得分:0)
库System Rules提供了用于在JUnit测试中模拟输入的规则TextFromStandardInputStream。
id :: f b -> f b
有关详细信息,请查看System Rules documentation。免责声明:我是系统规则的作者。