[英]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.