这符合我对异常处理最佳实践的浅薄理解。
如果我正在为抛出异常的测试用例编写单元测试,我是否只关心抛出正确的异常类型,还是应该检查更多?具体做法是:
如果我调用一个方法并期望一个NullReferenceException,我应该检查那个异常并确保它来自我期望它来自哪里吗?
如果抛出异常,我是否应该立即不关心状态,或者对系统状态进行断言是否仍然有效?
如果我将null传递给一个方法,并且抛出了NullArgumentException,我是否关心抛出哪个参数,或者只抛出它被抛出?
我目前认为,一旦抛出异常,所有赌注都会在系统状态方面下降,并且深入挖掘异常是很糟糕的,因为此时你开始检查你的方法是如何实现的。
感谢,
标记
答案 0 :(得分:4)
如果我正在为抛出异常的测试用例编写单元测试,我是否只关心抛出了正确的异常类型,还是应该检查更多?
如果您将测试视为推动您的应用程序设计的东西 - 您需要检查对于更多类客户端有意义的所有内容。
如果我调用一个方法并期望一个NullReferenceException,我应该检查那个异常并确保它来自我期望它来自哪里吗?
在测试中,您始终会检查是否在已知影响下获得了所需的结果。所以你调用方法,并捕获异常。你不应该关心它是什么以及如何抛出它 - 你被投掷的事实就好了。
如果抛出异常,我是否应该立即不关心状态,或者对系统状态进行断言是否仍然有效?
这取决于要求。如果你的app / library应该能够在异常处理后工作并且具有有效状态 - 你需要检查它。
如果我将null传递给一个方法,并且抛出了NullArgumentException,我是否关心抛出哪个参数,或者只抛出它被抛出?
假设您的图书馆为黑匣子。你传递了一些东西,你找回了一些东西。无论结果如何产生。是否产生了什么。
<强> UPD 强>:
正如@eschneider在评论中提到的那样 - 你还应该检查抛出的异常是否是正确的类型。
答案 1 :(得分:1)
如果我调用一个方法并期望一个NullReferenceException,我是否应该检查该异常并确保它来自我期望它来自哪里?
您从该测试中获得的代码知识是否重要?如果是 - 测试它。使用NRE可能就足够了(并且通常是)你知道它在某些条件下被抛出,这就是它的全部内容。
如果抛出异常,我是否应该立即关注状态,或者对系统状态进行断言是否仍然有效?
这完全取决于您的要求。如果在特殊情况下的状态需要以某种方式处理,那么你肯定应该为此编写测试。
如果我将null传递给一个方法,并且抛出了NullArgumentException,我是否关心抛出哪个参数,或者只抛出它被抛出?
考虑一下您的最终用户。他会关心什么论证引起了例外吗?你会关心吗?如果你的最终用户是程序员通过日志文件搜索可能的失败原因,那么我可以想象他会感谢你提供这些信息。它始终是“它对用户有什么价值吗?”的问题。。如果是(并且您想确保已提供该值) - 测试它。
我目前认为,一旦抛出异常,所有的赌注都会在系统状态方面下降,深入挖掘异常是很糟糕的,因为那时你开始检查你的方法已实施。
异常,因为名称表示意味着异常情况。所有投注都是关闭的,取决于 取决于您的应用程序在这些特殊情况下采取的措施。如果所有赌注都没有,我认为你的申请行为相同(以最简单的方式处理它并忘记它)。但是,如果您的代码想要做某事(如日志,最终用户的格式,重新抛出等),那么验证它确实是正确的异常,并在某些情况下抛出正确的消息定义明确的观点 - 所有这些都是有价值的,值得测试。