测试新的操作员失败
我创建了一个类,其中有一些新的操作符在构造函数中。我已经在构造函数中创建了守卫来管理新的操作失败,但现在我想测试它。测试新的操作员失败
作为例子,我有一个构造是这样的:
Function::Function()
{
try
{
m_pxArgument = new Argument();
}
catch(std::bad_alloc)
{
throw MemoryException();
}
}
是否有可能创建一个测试中,我可以告诉new操作符失败,测试我抓码?
如果Argument
是您的类/结构体 - 那么在此类中定义operator new仅用于UT目的。
class Argument {
//...
#ifdef UNIT_TEST
static bool& failNew() { static bool failNew = false; return failNew; }
void* operator new(size_t size)
{
if (!failNew())
return ::operator new (size);
failNew() = false;
throw std::bad_alloc("Argument");
}
#endif
};
每次需要失败时,只需设置Argument::failNew() = true;
。
谢谢,这是一个很好的建议。我会尝试一下,如果它适合我,我会告诉你。 – Jepessen
要做这样的测试,您需要为class Argument
重载operator new
,然后提供一个在您的测试用例中引发的定义。但是,由于在运行时无法轻松交换,您可能需要单独的测试程序。
如果你是我的C++学生,我首先会问,为什么你使用new和a可能是“裸”指针成员变化无论如何。第一个选择是创建一个类型为Argument的成员变量,并跳过显式的堆分配。如果你真的需要在现代的代码动态分配,我建议使用shared_ptr<Argument>
和 功能::()函数:m_pxArgument(make_shared()){}
第二个问题我想问一下,就是为什么你要将std::bad_alloc
翻译成您自己的异常类型,如果需要在构造函数中完成。 std::bad_alloc
是您实际遇到的情况的标准化例外情况,如果发生这种情况,生活通常很糟糕,您的小过程无法恢复很多(请参阅Charles Weir和James Noble的模式“Oates上尉”)。
嗨。起初,如我所说,这只是一个例子。我真正的班级有点复杂,需要新的操作员。但我会检查share_ptr,感谢这个建议。对于你的第二个回复,我想这样做是因为我想为库提供统一的异常管理,在这种情况下,我认为首选通用内存异常是因为它没有提供关于内部实现的细节,随着时间的推移。 – Jepessen
我不是专家程序员,但我认为最好在构造函数之外使用'try' ... – 2012-09-16 09:27:35
'Argument'是你的类/结构吗? – PiotrNycz
这只是一个例子,但try语句必须留在里面,因为真正的类更复杂,我想处理特定于库的异常。在这种情况下,std :: bad_alloc是一个有效的异常,但在我看来,它是由内部管理引发的并不好。用户必须对类内部没有任何了解,所以对于内部异常也是如此。 – Jepessen