2016/04/28

[c++]モックというかスタブというかを作るのは難しそう

単体テストを作るときはGoogle Testを使うようになってきた。
あまり大したことをするわけではなく、TEST_Fと、SetUp()/TearDown()と、あとは集計機能を使うくらいだ。
だいたいCなので、これとFFFを組み合わせ、GCCなのでgcov/lcovでカバレッジを見ている。

 

ただ、最近C++を使うことがあった。
classが出てくると、はてモックというかスタブというか、とにかく偽物の本体をどうやって作ろうか、と悩むことになった。

Google Testなので、Google Mockがよいか、と調べているところなのだが、なかなか思ったことができるかどうかまでたどりつかない。
調べているのは、

  • 簡単に空関数をそれっぽく作ってくれる
  • できたら、呼び出し回数などをカウントしてくれるとうれしい
  • ただし、元ソースは変更しないで済む

というところ。

サンプルのPainterは、Turtleをコンストラクタでもらうようになっていたけど、たとえばこんな風にメンバ変数でインスタンスを持っている場合だったらどうしたらよいのだろう?

------
#include "Turtle.h"

class Painter {
public:
    Painter() {}
    ~Painter() {}

    bool DrawCircle(int x, int y, int r);

private:
    Turtle turtle_;
};

-------

Turtleクラスであることは決まっているので、ここをMockで代用することができない。
インスタンスだから、Turtleも中身を作らないとリンクエラーになるから、自分で空関数を書けばよいのだけど、それだけだと呼び出しカウントを数える処理も自分で書かないといけない。
そもそも、Google Mock使ってないし!

じゃあ、Turtle.h自体を書き換えようかと思ったけど、Painter.hとTurtle.hが同じディレクトリにある場合、インクルードパスの指定を別ディレクトリにしても、カレントを先に参照するようで、偽造したTurtle.hを読んでくれない。

うーむ・・・。


どうせファイルごとにしかテストしないので、一時的に本命のTurtle.hをリネームしておく、という方法でよいかもしれない。

格好は悪いのだけど、あまり時間を掛けたいところではないのよねぇ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。