Cygwin上のg++でGoogle Mockを動かす
"実践テスト駆動開発"超良いですね。
ということで、C++で使える単体テストフレームワークであるGoogle testとモックフレームワークであるGoogle Mockを使える環境を整えましょうという話になりますね。
Cygwin上で動かせるようになれば、あとはどこでも動かせるだろうと思ったのでCygwin上で動かせるようにしてみました。
では早速。
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とか書きたかったけどもう眠いよ!
寝るよ!
おやすみなさい!