1

我创建了一个类,其中的构造函数中有一些的运算符。我已经在构造函数中创建了守卫来管理新的运算符失败,但现在我想测试它。

例如,我有一个这样的构造函数:

Function::Function()
{
  try
  {
    m_pxArgument = new Argument();
  }
  catch(std::bad_alloc)
  {
    throw MemoryException();
  }
}

是否可以创建一个测试,在其中我可以告诉新操作员失败,以测试我的 catch 代码?

4

2 回答 2

4

如果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;每次需要使其分配失败时进行设置。

于 2012-09-16T09:41:30.577 回答
1

要进行这样的测试,您需要 operator new为您重载class Argument,然后提供一个定义,以便在您的测试用例中抛出。但是,由于在运行时无法轻松交换,您可能需要一个单独的测试程序。

如果你是我的 C++ 学生,我首先会问,为什么你使用 new 并且 a 可能是“裸”指针成员,无论如何都是可变的。第一种选择是创建一个 Argument 类型的成员变量并跳过显式堆分配。如果您真的需要现代代码中的动态分配,我建议您使用shared_ptr<Argument>和 Function::Function():m_pxArgument(make_shared()){}

我想问的第二个问题是,为什么要转换std::bad_alloc为自己的异常类型,以及是否需要在构造函数中完成。std::bad_alloc是您实际遇到的情况的标准化例外,如果发生这种情况,live 通常会很糟糕,以至于您的小过程无法恢复(参见 Charles Weir 和 James Noble 的模式“Captain Oates”)。

于 2012-09-16T09:44:18.237 回答