Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我有没有办法在C++;?_C++_Googletest_Friend - Fatal编程技术网

C++ 我有没有办法在C++;?

C++ 我有没有办法在C++;?,c++,googletest,friend,C++,Googletest,Friend,我正在使用gtest对cpp类进行单元测试。考虑一种情况,我想让测试类成为实际类的一个朋友,这样它就可以对它的私有状态进行单元测试。这对我来说很好。问题在于,当使用非常有用的TEST\P宏(它允许您参数化测试实例化)时,框架会稍微损坏测试名称 所以我有点像 class FooTester { FooTester() {} } TEST_P(FooTester, TestCoolFeature) { // test my cool feature that needs access to

我正在使用gtest对cpp类进行单元测试。考虑一种情况,我想让测试类成为实际类的一个朋友,这样它就可以对它的私有状态进行单元测试。这对我来说很好。问题在于,当使用非常有用的
TEST\P
宏(它允许您参数化测试实例化)时,框架会稍微损坏测试名称

所以我有点像

class FooTester {
    FooTester() {}
}

TEST_P(FooTester, TestCoolFeature) {
// test my cool feature that needs access to Foo's internal state
}
这是伟大的,但为了允许这一点,我必须提供

class Foo {
    friend class FooTester_TestCoolFeature;
}
我们可以通过宏magic gtest创建一个我没有显式声明的新类,它是测试类和测试方法名称的组合

这表面上很好,但有点难看。它需要我为每个需要这种访问的新测试方法添加一个新的friend类。唯一真正的问题是,如果gtest改变它的实现并以不同的方式损坏类名,它可能会破坏我的测试


有没有办法使用一些
#定义
魔术或类似的方法来声明所有
FooTester*
类为
friend
s?

不要使用
friend
类来实现这一点。如果要从
FooTester
访问
Foo
,请公开继承它:

class FooTester : public Foo
{
    FooTester() {}
}

测试通常不应该依赖于私有的内部状态否,没有办法通配符友元声明。您可以执行类似于
friend class TooTestAccess
的操作,然后向该类添加静态函数,以公开所需内容。您还可以与模板交朋友,并让不同的实例化公开不同的私有/受保护成员。虽然Mooing Duck的观点站得住脚,但依赖项反转(包括模板策略)——可能与模拟相结合——也可能会有所帮助。我同意我通常不会这么做,但我发现自己的选择是改变规则,或者完全重写几百个坏掉的测试(这不是我最初编写的,但我离题了)。