2014年11月19日水曜日

Google MockのInSequenceの有効範囲

Google Mockで EXPECT_CALLが指定した順番通りに起こることを期待するときに使うInSequenceだが、そもそもどこのEXPECT_CALLに効いているのか、はっきり分からずに使っていたので、ちょっと調べてみた。

結論から書くと、InSequenceオブジェクトを作成してから解体されるまで。ただし同一スレッド内に限る。

実装を見るとInSequenceオブジェクト自体はsequence_created_というフラグを持っているだけで、スレッド内でグローバルなg_gmock_implicit_sequenceに、コンストラクタで作ったSequenceオブジェクトを設定したり、デストラクタでSequenceをdeleteしながらNULLを設定したりしている。

{
  InSequence s1;
  {
    InSequence s2;
      {
        InSequence s3;
        foo();
      }
  }
}
のようなネストの内側でInSequenceオブジェクトを作っても、上の例だとs2やs3のコンストラクタを実行する時点では既にg_gmock_implicit_sequenceは設定されているので、新たなSequenceオブジェクトを作成することはない。また、s2やs3のデストラクタを実行する際には、コンストラクタで何もしなかったのでデストラクタでも何もしない。また、foo()の中でEXPECT_CALLを使っていたら、そこでもs1の効果は及ぶ。

要するに、InSequenceオブジェクトを作りすぎても、それはフラグを1つ持ったオブジェクトを作るだけで、ほぼ害はないわけだ。InSequenceを効かせたいEXPECT_CALLを並べたテスト用のサブルーチンを作るときなんかは、呼び出し元がInSequenceオブジェクトを作ってるかどうかは気にせず、とりあえず自身もInSequenceオブジェクトを作ってしまってもバチは当たらないだろう。

0 件のコメント:

コメントを投稿