Java Mockito:如何在引发私有异常时进行测试?(不是私人方法)



我有一个测试,它从某个库(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());

最新更新