1

コンストラクターに新しい演算子があるクラスを作成しました。新しいオペレーターの失敗を管理するためにコンストラクターにガードを作成しましたが、今度はそれをテストしたいと思います。

例として、次のようなコンストラクターがあります。

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

私の catch コードをテストするために、新しいオペレーターに失敗するように伝えることができるテストを作成することは可能ですか?

4

2 に答える 2

4

クラス/構造体の場合Argument- UT の目的のためだけに、このクラスで演算子 new を定義します。

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 may be "naked" ポインター メンバーを可変的に使用するのかを最初に尋ねます。最初の選択肢は、Argument 型のメンバー変数を作成し、明示的なヒープ割り当てをスキップすることです。最新のコードで動的割り当てが本当に必要な場合はshared_ptr<Argument>、Function::Function():m_pxArgument(make_shared()){}を使用することをお勧めします。

2 つ目の質問はstd::bad_alloc、独自の例外型に変換する理由と、コンストラクターで変換する必要があるかどうかです。std::bad_allocこれは、実際に遭遇する状況の標準化された例外であり、それが発生した場合、ライブは通常、小さなプロセスが回復することができないほど悪いです (Charles Weir と James Noble によるパターン「Captain Oates」を参照してください)。

于 2012-09-16T09:44:18.237 に答える