2016-11-07 117 views
0

我正在尝试创建一个测试,以验证我的代码(请参阅下面的伪代码)能够正确捕获异常。我知道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 ; 
    } 
+0

如果该方法捕获异常,它不会暴露给调用方法,并且您无法测试它。你可以测试抛出的异常(通过重现你期望它发生的场景 - 如果抛出你的测试将失败)。该方法捕获的任何异常不是其签名的一部分,应该被视为实现细节,不在任何特定单元测试的范围内。 – nbrooks

+0

这个问题可能表明你正在测试的方法有些不对劲。如果它是一种应该返回结果的方法,那么让它捕获异常,打印出消息,然后继续下去,就好像一切都很顺利,可能不是它应该做的。如果它是一种只是做东西并打印输出或打印错误信息的方法,那么无论如何将很难进行单元测试。在后一种情况下,您可能希望将该方法重构为一个执行计算和打印结果的方法,并对第一个进行单元测试。 – ajb

+0

你也可以发布你的代码吗? – Jobin

回答

1

你的软件的方法是不是重新抛出异常一条消息。它只是通过打印信息来消除例外。在这种情况下,调用测试方法永远不会知道这个异常,所以你不能测试这个场景或者验证这个消息。