2010-03-07 99 views

回答

26

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

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

如果我有另一個測試例如BarReturnsOneOnSth,那麼怎麼辦?我是否還需要爲該測試添加另一個FRIEND_TEST聲明? – pajton 2010-03-07 13:41:03

+1

是的。每個考試在技術上都是一門課程,你需要一次一個朋友。 – hobbit 2010-03-07 13:48:57

+15

我怎樣才能做到這一點,並不強迫我在頭文件中加入googletest頭文件,類爲'Foo'? – 2011-12-12 17:07:31

19

我知道這是舊的,但我今天搜索了相同的答案。 「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; 

這工作,因爲每個測試是在以前的答覆中提到自己的類。

+0

@DaveRuske請不要在編輯中解釋你的編輯。這是編輯總結的目的。如果問題是6個字符的限制,您可以在主體的某個地方添加一個''(''是註釋,因此不會顯示)。 – 2017-04-18 17:06:05

0

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

允許朋友測試訪問私人成員將導致難以維護的代碼庫。只要組件的內部實現細節被重構就會中斷的測試不是你想要的。如果需要額外的努力來獲得一個可以通過其公共接口來測試組件的設計,那麼只要更新組件的公共接口,就會得到只需要更新的測試。

依賴於gtest/gtest_prod.h的測試應該被視爲設計不佳的標誌。

+1

我知道這是有爭議的(希望它爲你贏得了某種「有爭議的答案」徽章),但我很高興有人提出了這個觀點。許多人都同意@Martin這個! https://dzone.com/articles/principles-creating – pestophagous 2017-07-27 23:15:24

相關問題