Mockito处理已检查和未检查的例外情况不同,这主要是由于Java如何治疗这些例外以及如何设计用于使用方法签名的情况。
##检查例外
- 定义:检查的例外是在编译时检查的例外。它们必须被捕获在“ try-catch”块中,或使用`throws'关键字[3]在方法签名中声明。
- Mockito处理:仅在方法签名中声明异常时,Mockito才允许从模拟对象抛出检查的异常。如果您尝试抛出未声明的检查异常,Mockito将带有“ MockitoException”,并表示该方法的检查异常无效[1] [2]。例如,如果方法“ void somemethod()抛出ioexception”,则可以使用Mockito丢下``IOEXception''而没有问题。
##未选中的例外
- 定义:未检查的例外是在编译时未检查的例外。它们通常是指示编程错误[3]的运行时异常或错误。
- 摩根托处理:莫科托(Mockito)可以轻松处理未经检查的例外,而无需任何限制。您可以使用`thenthrow()或`dothrow()`来模拟未选中的例外,例如`runtimeException'或`nullpoInterException',而无需在方法签名中声明它们[1] [2]。这使得在意外情况下测试错误处理变得直接。
##解决方案的解决方案
如果您需要在方法签名中投掷未声明的检查例外,则可以使用Mockito的`doanswer()`方法。此方法允许您为模拟方法定义自定义行为,包括抛出方法签名中未声明的异常[4]。但是,这种方法需要更多的手动处理,并且通常不如使用`thenthrow()`or`or`dothrow()`。
总而言之,Mockito处理检查异常的处理更加限制,因为它遵守Java的编译时间检查,而未检查的异常可以自由抛弃,从而使它们易于在测试中使用。
引用:[1] https://blog.sammkinng.in/blogs/checked-exception-is-invalid-for-this-method
[2] https://www.toptal.com/java/a-guide-to-everyday-mockito
[3] https://rollbar.com/blog/how-to-to-handle-checked-checked-exceptions-in-java/
[4] https://stackoverflow.com/questions/3762047/throw-checked-exceptions-from-mocks-with-mockito
[5] https://stackoverflow.com/questions/38852392/mockito-difference-betnewen-thenthrowexception-class-class-and-thernwrownew-excepti
[6] https://www.reddit.com/r/java/comments/1cct4iq/if_everyone_hates_checked_checked_exceptions_wheres_the/
[7] https://www.janbasktraining.com/community/java/throw-checked-exceptions-from-mocks-with-mockito
[8] https://www.youtube.com/watch?v=6-gj2w2ycmi
[9] https://www.browserstack.com/guide/mockito-throw-exception