C++ 我有没有办法在C++;?
我正在使用gtest对cpp类进行单元测试。考虑一种情况,我想让测试类成为实际类的一个朋友,这样它就可以对它的私有状态进行单元测试。这对我来说很好。问题在于,当使用非常有用的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
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的观点站得住脚,但依赖项反转(包括模板策略)——可能与模拟相结合——也可能会有所帮助。我同意我通常不会这么做,但我发现自己的选择是改变规则,或者完全重写几百个坏掉的测试(这不是我最初编写的,但我离题了)。