【问题标题】:Is there a way for me to wildcard a friend class in C++?有没有办法让我在 C++ 中通配一个朋友类?
【发布时间】: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


【解决方案1】:

不要为此使用friend 类。如果您想从FooTester 访问Foo,请公开继承它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多