在JUnit中测试引发的异常
问题描述:
我正在尝试创建一个测试,以验证我的代码(请参阅下面的伪代码)能够正确捕获异常。我知道JUnit是能够测试代码是否抛出具有以下代码的异常:在JUnit中测试引发的异常
@Test (expected = ArrayIndexOutOfBoundsException.class)
但是,我原来的我测试捕获该异常的软件代码,并显示一条消息
catch (ArrayIndexOutOfBoundsException E) {
System.out.print("The output should be of even length!");
}
JUnit有任何方法来验证此消息吗?或者我应该改变我的口号?
注:我看过,我应该使用下列内容:
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void decodeOddLengthInput() {
thrown.expect(ArrayIndexOutOfBoundsException.class);
thrown.expectMessage("Message");
但程序崩溃,因为它不能识别ExpectedException
对象。
的方法,我想测试的伪代码(不要发布,因为隐私原因,确切的事情):
public String decode(byte[] array){
try{
for(int i= 0; i<array.length; i= i+2){
//basically it crashes when input is an array of odd length (because of i=i+2)
get byte at array[i] and turn it into a string;
}
}
catch (ArrayIndexOutOfBoundsException E) { System.out.print("Message!");}
return string ;
}
答
你的软件的方法是不是重新抛出异常一条消息。它只是通过打印信息来消除例外。在这种情况下,调用测试方法永远不会知道这个异常,所以你不能测试这个场景或者验证这个消息。
如果该方法捕获异常,它不会暴露给调用方法,并且您无法测试它。你可以测试抛出的异常(通过重现你期望它发生的场景 - 如果抛出你的测试将失败)。该方法捕获的任何异常不是其签名的一部分,应该被视为实现细节,不在任何特定单元测试的范围内。 – nbrooks
这个问题可能表明你正在测试的方法有些不对劲。如果它是一种应该返回结果的方法,那么让它捕获异常,打印出消息,然后继续下去,就好像一切都很顺利,可能不是它应该做的。如果它是一种只是做东西并打印输出或打印错误信息的方法,那么无论如何将很难进行单元测试。在后一种情况下,您可能希望将该方法重构为一个执行计算和打印结果的方法,并对第一个进行单元测试。 – ajb
你也可以发布你的代码吗? – Jobin