よくある質問(FAQ)

テストドライバからテスト対象クラスのprivateメンバー変数にアクセスする方法を教えてください。

【QTE21】テスト作成に関する問題

質問

テストドライバからテスト対象クラスのprivateメンバー変数にアクセスする方法を教えてください。

回答

テスト対象クラスのprivateメンバ変数をテストする方法として、
① テストフィクスチャクラスをfriendクラスとして宣言する方法
② テストドライバ関数をfriend関数として宣言する方法
の2通りあります。

① テストフィクスチャクラスをfriendクラスとして宣言する方法
テストフィクスチャクラスのメンバー関数がテスト対象クラスのprivate変数にアクセスできるようにテストフィクスチャクラスをテスト対象クラスのfriendクラスとして宣言します。次にプライベート変数へのGetter関数をテストフィクスチャクラスに定義します。テストドライバ関数はGetter関数を使ってprivate変数にアクセスします。

例を使って説明します。
テスト対象であるSampleクラスのnum_メンバーの値をテストする関数を作成します。
SampleTestクラスがSampleクラスのnum_メンバーにアクセスできるように、SampleTestクラスをSampleクラスのfriendクラスとして宣言します。

// テスト対象ヘッダ(sample.h)

class Sample {
friend class SampleTest;
public:
  // 省略
private:
  int num_;
};

テストフィクスチャクラスにSampleクラスのnum_メンバにアクセスするget_numメンバー関数を定義します。
テストドライバ関数はテストフィクスチャクラスのget_num関数を呼び出して、num_メンバーの値を取得します。

// テストドライバソース(sampleTest.cpp)

class SampleTest : public ::testing::Test {
protected:
  int get_num(const Sample& sample) { return sample.num_; }
};
TEST_F(SampleTest, test1)
{
  Sample obj;
  // 省略
  EXPECT_EQ(2, get_num(obj));
}

②テスト関数をfriend関数として宣言する方法
テストドライバのテスト関数をテスト対象クラスのfriend関数として宣言します。friend関数として定義するにはFRIEND_TESTマクロを使用します。


(例)TEST(SampleTest, test1)関数を、以下のようにFRIEND_TESTマクロを使用してfriend関数として宣言します。

#include "gtest/gtest.h"
class Sample {
  FRIEND_TEST(SampleTest, test1);
  // 省略
};