我有一个测试,它从某个库(com.googlecode.jsonrpc4j
(中抛出HttpException
。我写了一个这样的测试:
Exception exception = assertThrows(HttpException.class,
() -> this.myApi.getInformation(date1, date2)
);
为此,我导入了HttpException
类,如下所示:
import com.googlecode.jsonrpc4j.HttpException;
然而,这样做会给我一个错误信息:
'com.googlecode.jsonrpc4j.HttpException' is not public in 'com.googlecode.jsonrpc4j'.
Cannot be accessed from outside package
因此,即使这个异常是在某些条件下抛出的,我也无法测试这个异常是否会在这些条件下抛出。有什么方法可以让我测试一下吗?
我的解决方法是,由于私有HttpException
扩展了RuntimeException
,所以我可以通过断言抛出了RuntimeException
来测试它。然而,有更好的方法来测试这一点吗?
我同意Andrew S.的意见,您的API不应该公开私有异常:
您的代码可能不应该抛出在另一个库中定义的异常,因为这会将实现泄漏给调用者,并迫使调用者处理将来可能更改的异常。相反,定义自己的异常,捕获依赖库异常,并抛出自己的异常。这也应该有助于简化单元测试。
但如果确实必须并且不能更改代码,则有一个变通方法:断言抛出了一个常规异常,然后断言该异常的规范名称:
Exception exception = assertThrows(
RuntimeException.class,
() -> this.myApi.getInformation(date1, date2));
assertEquals(
"com.googlecode.jsonrpc4j.HttpException",
exception.getClass().getCanonicalName());