2

我读过这个关于模拟抛出异常的问题。答案建议我创建一个假装是真实对象的模拟对象。

那不是我想要的。如果我替换一个真实的对象,我会丢失一部分真实的代码。我想以最少的更改调用真实代码,并在该代码的随机点从其中抛出异常。

是否可以在从单元测试调用的代码的随机点抛出异常?

4

3 回答 3

3

不要将随机性放入单元测试中。只会给你带来麻烦。单元测试应该总是有一些一致性。特别是如果你想让他告诉你他变红时出了什么问题。如果你在你的单元测试中实现一个随机异常,它可能会发生他有时会崩溃并返回一个红色条。也许下一次运行它的错误又消失了。这真的不是单元测试的目的,你将很难找到曾经发生过的失败测试的问题。

更好的方法是系统地测试代码的关键部分。用一个模拟对象替换每个关键方法,它会抛出你想要测试的异常类型,并像这样覆盖每个测试用例。当您查找该错误时,这将为您提供更多有关出现问题的信息。

希望这可以帮助。

于 2013-03-05T13:56:30.340 回答
1

似乎您正在尝试测试异常处理,我认为这不是随机抛出异常并检查它是否被咳嗽的好方法,如果您需要在某些条件下测试处理,您需要模拟真实的条件对象,例如应该导致异常的非法情况。

您仍然可以通过可以从外部(在您的单元测试中)设置的本地变量来产生这种行为,这将导致代码根据该变量抛出异常,但正如我所说,我认为这不是一个好方法。

于 2013-03-05T12:22:44.583 回答
1

我可以考虑解决这个问题。

1- 制作一个名为 RandomException() 的函数;如果随机值可被 3 整除,则该throw异常,否则不会抛出异常。确保这个函数被封装在这个代码块中。

#if DEBUG
void RandomException()
{
    // gen random value
    // if random value % 3 == 0 throw the exception now
}
#else
void RandomException()
{
}
#endif

这样,当您发布代码时,这些函数调用不会影响程序。

我希望这个想法对你有所帮助。

于 2013-03-05T12:12:12.653 回答