java单元测试输入异常

时间:2015-06-18 09:36:11

标签: java unit-testing exception mocking

我有从扫描程序扫描输入的方法:

private int chooseItem() throws IOException {
    return inputoutput.inputValue();
}

public int inputValue() throws IOException {
    Scanner scanner = new Scanner(System.in);
    return scanner.nextInt();
}

正如您所见,它希望将int作为传入值,如果我输入String,则应该抛出InputMismatchEcxeption。问题是如何在Java中我可以教inputValue返回smth而不是int,例如,字符串并检查异常被抛出的事实?换句话说要测试一下吗? 我试过了:

IO io = mock(IO.class); 

when(io.inputValue()).thenReturn("fdas");

但是mockito只是说io.inputValue不能返回字符串。

3 个答案:

答案 0 :(得分:2)

如果您想模拟测试中的输入,可以执行以下操作。

InputStream inputStream = new ByteArrayInputStream( "fdas".getBytes() );
System.setIn(inputStream);

并且在inputStream对象中,您可以使它传递String而不是int。

答案 1 :(得分:1)

您可以将System.in重定向到输入流以读取无效输入:

InputStream in = System.in;
System.setIn(new ByteArrayInputStream("fdas".getBytes()));
try {
    // call inputValue method
} finally {
    System.setIn(in);  // restore old input stream
}

答案 2 :(得分:0)

最简单的方法是使用Mockitos thenThrow选项使得始终抛出InputMisMatchException。然后,您可以通过某种方法在自己的代码中测试对它的处理。

when(io.inputValue()).thenThrow(new InputMismatchException());