52

google-test TestCase クラスのフレンドをクラスに有効にする可能性があると聞きました。これにより、テストがプライベート/保護されたメンバーにアクセスできるようになります。

それを達成する方法は?

4

4 に答える 4

52

これを試してください(Googleテストドキュメントから直接...):

FRIEND_TEST(TestCaseName, TestName);

例えば:

// foo.h
#include <gtest/gtest_prod.h>

// Defines FRIEND_TEST.
class Foo {
  ...
 private:
  FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
  int Bar(void* x);
};

// foo_test.cc
...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}
于 2010-03-07T13:38:10.393 に答える
36

これは古いことは知っていますが、今日は同じ答えを探していました。" gtest_prod.h " は、テスト クラスを参照する単純なマクロを導入するだけです。

#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test

したがってFRIEND_TEST(FooTest, BarReturnsZeroOnNull);、次と同等です。

friend class FooTest_BarReturnsZeroOnNull_Test;

前の回答で述べたように、各テストは独自のクラスであるため、これは機能します。

于 2012-10-08T16:18:58.643 に答える
10

はるかに優れた戦略は、ユニット テストの中でフレンド テストを許可しないことです。

フレンド テストがプライベート メンバーにアクセスできるようにすると、コード ベースの保守が困難になります。コンポーネントの内部実装の詳細がリファクタリングされるたびに壊れるテストは、あなたが望むものではありません。代わりに、パブリック インターフェイスを介してコンポーネントをテストできる設計を取得するために特別な努力が費やされた場合、コンポーネントのパブリック インターフェイスが更新されるたびに、更新のみが必要なテストが取得されます。

に依存するテストgtest/gtest_prod.hは、設計が不十分であることの兆候と見なされるべきです。

于 2017-04-18T17:30:51.500 に答える