如何在单元测试中模拟在代码的随机点抛出异常?
本文关键字:随机 抛出异常 模拟 单元测试 代码 | 更新日期: 2023-09-27 18:02:12
我读过这个关于模拟抛出异常的问题。答案建议我创建一个模拟对象,假装是一个真正的对象。
那不是我想要的。如果我替换了一个真实的对象,我就丢失了一部分真实的代码。我想以最小的更改调用实际代码,并在该代码的随机点从内部抛出异常。
是否有可能在单元测试中调用的代码随机点抛出异常?
不要在单元测试中加入随机性。它只会给你带来麻烦。单元测试应该总是有一些一致性。尤其是如果你想让他告诉你他脸红的时候哪里出了问题。如果你在你的单元测试中实现一个随机异常,它有时会崩溃并返回一个红色条。也许下次运行时,错误又消失了。这真的不是单元测试的目的,你会在一次失败的测试中发现大问题。
一个更好的方法是系统地测试代码的关键部分。用模拟对象替换每个关键方法,模拟对象抛出您想要测试的异常类型,并像这样覆盖每个测试用例。当你在查找错误时,这会给你更多的信息,让你知道是哪里出了问题。我可以考虑一下这个工作。
1-创建一个名为RandomException()的函数;throw
异常,如果一个随机值能被3整除,否则它不会抛出异常。确保这个函数被封装在这段代码中。
#if DEBUG
void RandomException()
{
// gen random value
// if random value % 3 == 0 throw the exception now
}
#else
void RandomException()
{
}
#endif
这样当你释放代码时,这些函数调用不会影响程序。
我希望这个想法对你有帮助
似乎你正在尝试测试异常处理,我不认为这是一个很好的方法来抛出一个异常随机和检查它是否被捕获,如果你需要在某些条件下测试处理,你需要模拟一个真实对象的条件,像一个非法的情况,应该导致异常。
你仍然可以通过一个局部变量来产生这种行为,你可以从外部(在你的Unittest中)设置它,这会导致代码抛出一个异常,取决于这个变量,但如上所述,我认为这不是一个好方法。