簡體   English   中英

如何讓 google-test 課程與我的課程成為朋友?

[英]How to make google-test classes friends with my classes?

我聽說有可能讓 google-test TestCase 類朋友加入我的類,從而使測試能夠訪問我的私有/受保護成員。

如何做到這一點?

試試這個(直接來自谷歌測試文檔......):

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().
}

我知道這是舊的,但我今天正在尋找相同的答案。 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;

這是有效的,因為每個測試都是它自己的類,如上一個答案中所述。

更好的策略是在單元測試中不允許友元測試。

允許朋友測試訪問私有成員將導致難以維護的代碼庫。 每當組件的內部實現細節被重構時就會中斷的測試不是您想要的。 如果付出額外的努力來獲得可以通過其公共接口測試組件的設計,您將獲得僅在組件的公共接口更新時才需要更新的測試。

依賴於gtest/gtest_prod.h測試應該被視為糟糕設計的標志。

當你的測試類和你的測試類在不同的命名空間中時(例如你的測試在全局命名空間中),你可能需要向前聲明你的測試類並在 FRIEND_TEST 中添加你的命名空間前綴:

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

class FooTest_BarReturnsZeroOnNull_Test;

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

// foo_test.cc
using namespace my_namespace;

...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}

我知道友元單元測試(或一般 C++ 中的友好性)和白盒測試是一個有爭議的主題,但是當您研究復雜的科學算法時,您需要測試和驗證其中的每一步,但您不知道不想在公共(甚至受保護)接口中公開,朋友測試在我看來是一種簡單實用的解決方案,尤其是在測試驅動的開發方法中。 如果使用友好性或白盒測試違背了一個人的宗教信仰,那么以后總是可以重構代碼(或完全刪除白盒測試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM