About

地図会社で働いていたプログラマ。

2013年7月16日火曜日

GoogleTestでprivateメンバ関数をテストする

参考:http://code.google.com/p/googletest/wiki/AdvancedGuide#Private_Class_Members

テスト対象ソースを汚す必要のない方法2の方が良いかな。


方法1 friendを使用する

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <string>

// テスト対象のクラス
class ClassPrivateMethod1
{
// テストフィクスチャをフレンドにする
friend class ClassPrivateMethodTest1;
private:
 // このprivateメンバ関数のテストをしたい 
 std::string foo() { return std::string("This is a private method!"); }
};

// テストフィクスチャ
class ClassPrivateMethodTest1 : public ::testing::Test
{
public:
 virtual void SetUp() {}
 virtual void TearDown() {}
 // privateメンバ関数へのアクセサ
 virtual std::string foo() { return c.foo(); }
 
protected:
 ClassPrivateMethod1 c;
};

TEST_F(ClassPrivateMethodTest1, accessPrivateMethod)
{
 // アクセサを使ってprivateメンバ関数のテストができた!
 EXPECT_STREQ("This is a private method!", foo().c_str());
}

方法2 FRIEND_TESTマクロを使用する

// テスト対象のクラス
class ClassPrivateMethod2
{
// 特定のテストケースをフレンドにする
FRIEND_TEST(ClassPrivateMethodTest2, accessPrivateMethod);
private:
 // このprivateメンバ関数のテストをしたい 
 std::string foo() { return std::string("This is a private method!"); }
};

TEST(ClassPrivateMethodTest2, accessPrivateMethod)
{
 ClassPrivateMethod2 c;
 EXPECT_STREQ("This is a private method!", c.foo().c_str());
}