2010-03-07 97 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

相关问题