在JUnit测试中提前输入

时间:2017-06-10 09:23:46

标签: java eclipse input junit inputstream

我正在创建JUnit并测试以下方法:

public static String readLine() throws IOException{

   BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
   return stdin.readLine();
}

我想提前在JUnit测试方法中输入字符串,而不是在readLine()中通过在我自己的控制台中获取inputput来实现。

我该怎么做?

3 个答案:

答案 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。免责声明:我是系统规则的作者。