Cygwin上のg++でGoogle Mockを動かす

"実践テスト駆動開発"超良いですね。

ということで、C++で使える単体テストフレームワークであるGoogle testとモックフレームワークであるGoogle Mockを使える環境を整えましょうという話になりますね。

Cygwin上で動かせるようになれば、あとはどこでも動かせるだろうと思ったのでCygwin上で動かせるようにしてみました。

では早速。

下準備

Cygwin上でwget, unzip, make, g++が使えるようにしといてください。

Google Mockのダウンロード

とりあえず保存用のディレクトリを作って、そこにダウンロードして、解凍しましょう。

$ mkdir gmock
$ cd gmock
$ wget http://googlemock.googlecode.com/files/gmock-1.6.0.zip 
$ unzip gmock-1.6.0.zip

無理やり使えるようにする

うまくやればうまく使えるのかもしれませんがとりあえず
http://d.hatena.ne.jp/E_Mattsan/20120215/1329311774
この方を参考にさせてもらいます。

$ cd gmock-1.6.0/fused-src
$ g++ -I. -I./gmock -I./gtest -c gmock_main.cc
$ g++ -I. -I./gmock -I./gtest -c gmock-gtest-all.cc

これで

gmock_main.o  gmock-gtest-all.o

の二つのファイルができます。fused-src下のヘッダファイル(fused-src/gtest/gtest.hとfused-src/gmock/gmock.h)をインクルードし、最終的にこれらのオブジェクトファイルをリンクしてやれば良い、ということになります。

実際に使ってみる。

~/src/gmock_test/フォルダ下にサンプルプログラムを作成して実行してみたいと思います。

$ cp gmock_main.o ~/src/gmock_test/
$ cp gmock-gtest-all.o ~/src/gmock_test/
$ cp -R gmock/ ~/src/gmock_test/
$ cp -R gtest/ ~/src/gmock_test/

Google Mock超入門編
http://opencv.jp/googlemockdocs/fordummies.html
のTurtleのやつを動かしてみます。

とりあえず以下のファイルをばかすか作っていきます。

Painter.h

#ifndef _PAINTER_H
#define _PAINTER_H
#include "Turtle.h"

class Painter {
 public:
  Painter(Turtle* turtle)
    : turtle_(turtle){}
  ~Painter(){}

  bool DrawCircle(int x, int y, int r);
 private:
  Turtle* turtle_;
};
#endif // _PAINTER_H

Painter.cpp

#include "Painter.h"

bool Painter::DrawCircle(int x, int y, int r)
{
  turtle_->PenDown();
  return true;
}

Turtle.h

#ifndef _TURTLE_H
#define _TURTLE_H

class Turtle {
 public:
  Turtle(){}
  virtual ~Turtle() {}

  virtual void PenUp() = 0;
  virtual void PenDown() = 0;
};
#endif // _TURTLE_H

MockTurtle.h

#ifndef _MOCK_TURTLE_H
#define _MOCK_TURTLE_H
#include "gmock/gmock.h"
#include "Turtle.h"

class MockTurtle : public Turtle {
 public:
  MOCK_METHOD0(PenUp, void());  
  MOCK_METHOD0(PenDown, void());
};
#endif // _MOCK_TURTLE_H

PainterTest.cpp

#include "MockTurtle.h"
#include "Painter.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
using ::testing::AtLeast;

TEST(PainterTest, CanDrawSomething)
{
  MockTurtle turtle;
  EXPECT_CALL(turtle, PenDown())
    .Times(AtLeast(1));

  Painter painter(&turtle);

  EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}

ひー
そんで

$ g++ Painter.cpp PainterTest.cpp gmock_main.o gmock-gtest-all.o -I.

ってやるとビルドできるから

$ ./a.exe

とかやるとちゃんと動いたのがきっと確認できると思うよ!

最後のほうテストを書いて実装してとかちゃんとやりたかったしちゃんとMakefileとか書きたかったけどもう眠いよ!

寝るよ!

おやすみなさい!