测试新操作员失败
testing new operator fail
我创建了一个类,其中构造函数中有一些新的运算符。我已经在构造函数中创建了卫士来管理新的操作员失败,但现在我想测试它
例如,我有一个构造函数,它是这样的:
Function::Function()
{
try
{
m_pxArgument = new Argument();
}
catch(std::bad_alloc)
{
throw MemoryException();
}
}
有没有可能创建一个测试,让我告诉新的操作符失败,测试我的catch代码?
如果Argument
是你的类/结构,那么在这个类中定义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;
即可。
要进行这样的测试,您需要为class Argument
重载operator new
,然后提供一个抛出测试用例的定义。但是,由于在运行时无法轻松交换,您可能需要一个单独的测试程序。
如果你是我的C++学生,我会首先问,为什么你会可变地使用new和a可能是"裸"指针成员。第一种选择是创建Argument类型的成员变量,并跳过显式堆分配。如果您在现代代码中确实需要动态分配,我建议您使用shared_ptr<Argument>
和函数::Function():m_pxArgument(make_shared()){}
我想问的第二个问题是,为什么要将std::bad_alloc
转换为自己的异常类型,以及是否需要在构造函数中进行转换。std::bad_alloc
是你实际遇到的情况的标准化例外,如果发生这种情况,生活通常已经够糟糕的了,你的小过程对恢复没有多大作用(参见Charles Weir和James Noble的"Captain Oates"模式)。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 测试新操作员失败
- 过载操作员功能失败
- 用替代操作员提升精神 '|' 失败!当有两个可能的规则要走时