我有一个单元测试类Tester;我希望它访问Working类的私有(private)字段。

class Working {
    // ...
    private:
    int m_variable;
};

class Tester {
    void testVariable() {
        Working w;
        test( w.m_variable );
    }
}

我有以下选择:
  • 使m_variable public-丑陋的
  • make方法test_getVariable()-过于复杂的
  • friend class Tester添加到Working中-然后显式地“了解”测试仪,这是不好的

  • 我的理想是
    class Working {
        // ...
        private:
        int m_variable;
    
        friend class TestBase;
    };
    
    class TestBase {};
    
    class Tester : public TestBase {
        void testVariable() {
            Working w;
            test( w.m_variable );
        }
    }
    

    Working知道TestBase的地方,但不是每个测试都知道的地方...但是它不起作用。显然,友元对继承无效。

    这里最优雅的解决方案是什么?

    最佳答案

    通常,您的单元测试不应评估私有(private)变量。将测试写入接口(interface),而不是实现。

    如果您确实需要检查私有(private)变量是否具有特定特征,请考虑使用assert()而不是尝试为其编写单元测试。

    更长的答案(是为C#而不是C++编写的,但适用相同的原理)在https://stackoverflow.com/a/1093481/436641上。

    10-06 13:12