在实验4中需要我们对异常的处理进行测试:考虑 3.1 节中出现的多种非法情形,设计一组测试用例,人为制造非法输入的文件和非法输入的图操作指令,对程序进行健壮性和正确性测试,想方设法让程序崩溃(即验证程序是否有容错能力)。
问题来了,我们应该怎样对异常进行测试?
@Test注解有一个可选的参数,”expected”允许你设置一个Throwable的子类。如果你想要验证上面的canVote()方法抛出预期的异常,我们可以这样写:
@Test(expected = GrammarException.class)
public void test_vertex_args() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException {
GraphPoet g = (GraphPoet) new GraphPoetFactory().creatGraph("test/file/GraphPoet_vertex_args.txt");
}
简单明了,这个测试有一点误差,因为异常会在方法的某个位置被抛出,但不一定在特定的某行。同时没有办法检查抛出异常的信息。
如果要使用JUnit框架中的ExpectedException类,需要声明ExpectedException异常。
@Rule
public ExpectedException thrown= ExpectedException.none();
然后你可以使用更加简单的方式验证预期的异常。并且可以设置预期异常的属性信息。
@Test
public void test_vertex_args() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException {
thrown.expect(GrammarException.class);
thrown.expectMessage("The vertex args is lack.");
GraphPoet g = (GraphPoet) new GraphPoetFactory().creatGraph("test/file/GraphPoet_vertex_args.txt");
}
除了可以设置异常的属性信息之外,这种方法还有一个优点,它可以更加精确的找到异常抛出的位置。
另一种书写方式:
thrown.expect(IllegalArgumentException.class, “age should be +ve”);
在JUnit4之前的版本中,使用try/catch语句块检查异常
@Test
public void test_vertex_args() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException {
try {
GraphPoetFactory().creatGraph("test/file/GraphPoet_vertex_args.txt");
} catch (GrammarException ex) {
assertThat(ex.getMessage(), containsString("The vertex args is lack."));
}
fail("expected for GrammarException of The vertex args is lack.");
}
尽管这种方式很老了,不过还是非常有效的。主要的缺点就是很容易忘记在catch语句块之后需要写fail()方法,如果预期异常没有抛出就会导致信息的误报。我曾经就犯过这样的错误。
在IOException中,我们对如果没有找到对应文件,将会要求用户输入一个新的文件,并且重新进行文件的读取。
try{
}catch (IOException e) {
logger.warn(e.getClass().getName() + ":" + e.getMessage());
System.out.println("Please input a new file:");
Scanner in = new Scanner(System.in);
String newFilePath = in.nextLine();
g = (GraphPoet) new GraphPoetFactory().creatGraph(newFilePath);
}
在测试的时候,我们需要模拟用户输入一个正确的文件名称,这时需要用到IO流的内容的知识。
@Test
public void test_io() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException , OtherPropertyException{
GraphPoetFactory factory = new GraphPoetFactory();
String string = "test/file/GraphPoet.txt\r\n";
InputStream stdin = System.in;
System.setIn(new ByteArrayInputStream(string.getBytes()));
factory.creatGraph("test/file/GraphPoet_3333.txt");
System.setIn(stdin);
}
其中的string为正确的输入文件的地址的内容,我们新建一个输入流,将字符串的内容传入输入流,最后在进行时会抛出IOException,并且要求输入新的文件地址,如果没有抛出异常,那么就会运行失败。
使用JUnit测试预期异常
https://blog.csdn.net/tayanxunhua/article/details/20570457