【发布时间】:2020-08-19 11:20:22
【问题描述】:
我正在使用 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;
}
我们可以通过宏魔术看到 gtest 创建了一个我没有显式声明的新类,它是测试类和测试方法名称的组合。
这表面上很好,但有点难看。这将要求我为每个需要此访问权限的新测试方法添加一个新朋友类。唯一真正的(如果不太可能的话)问题是,如果 gtest 要更改其实现并以不同方式修改类名,它可能会破坏我的测试。
有没有办法使用一些#define 魔法或类似的方法来将所有FooTester* 类声明为friends?
【问题讨论】:
-
测试通常不应依赖私有内部状态
-
不,没有办法给朋友声明通配符。您可以执行
friend class TooTestAccess之类的操作,然后将静态函数添加到该类以公开您需要的内容。 -
您还可以与模板成为朋友,并让不同的实例化暴露不同的私有/受保护成员。虽然 Mooing Duck 的观点是正确的,但依赖倒置(包括模板策略)——可能与模拟相结合——也可能有所帮助。
-
同意我通常不会这样做,但我发现自己的选择是改变这条规则,或者完全重写数百个损坏的测试(我最初没有写,但是我跑题了)。
标签: c++ googletest friend