在写单元测试时,如何写异常的测试是很多人的难题。很多书建议使用如下方法进行测试:
public void method()
{
throw new RuntimeException("exception message");
}
public void testException()
{
try
{
method();
fail();
}
catch(Exception e)
{
assertTrue(true);/或者此处不写
}
}
通过这种测试,可以测试方法中是否会达到期望的要求,在方法出现预期中的异常时是否会抛出该异常,若没有像期望的一样抛出异常,则单元测试会运行到"fail();"使得单元测试不会通过。正常情况下是没有问题的。但是有的时候方法内部会有多个子方法抛出同一个异常(或者说抛出的多个异常都继承于同一个异常类),因此这个时候我们必须定位到是哪个子方法抛出的异常,而通过以上方法是不能达到这个目标的。为了达到这个目标,可以通过判断异常中的信息来判断是哪个子方法出错。通常,程序员会在抛出异常时会将产生该异常的原因写入异常信息中,如:new Exception(message)。因此,我们只要在单元测试中能捕捉到该异常信息,往往就能定位到该异常出现的位置。
只需要将以上测试的catch块中的语句改为如下语句即可:
assertTrue(e.toString().contains(exception message));