可以访问私有/保护状态的编写单元测试

问题描述 投票:0回答:1

我将Boost Test用于单元测试。我通常有一个夹具结构:

class ClassBeingTested
{
protected:
    int _x;             // Want to access this directly in my unit tests
};

struct TestFixture : public ClassBeingTested
{
    // I can access ClassBeingTested::_x here but it means i have to add getters for each test to call
    ClassBeingTested _bla;
};

但是,即使我的灯具继承自ClassBeingTested或使用朋友关系,我也无法从每个测试中访问私有/受保护的方法/状态:

BOOST_FIXTURE_TEST_CASE(test1, TestFixture)
{
    _bla.doSomething();
    BOOST_REQUIRE_EQUAL(_bla.x, 10);    // Compiler error. I cannot access ClassBeingTested::_x here
}

仅是灯具,这意味着我必须为要进行的每次访问添加一个新的吸气剂(或测试)。

有什么方法可以实现这一目标?我必须向ClassBeingTested添加仅用于测试的公共getter方法,这并不理想。

((请不要回答'使用公共界面进行测试',这并不总是可能的。)

c++ testing googletest boost-test gunit
1个回答
0
投票

您可以与struct ClassBeingTestedBuddy;中的friend struct ClassBeingTestedBuddy;成为好友测试伙伴class ClassBeingTested

让测试伙伴类公开所有测试所需的所有受保护或私有变量或方法。

看起来像...

struct ClassBeingTestedBuddy {
    ClassBeingTested* obj;
    ClassBeingTestedBuddy(ClassBeingTested* obj_)
      : obj{obj_} {}
};

...以及您想要公开的其他内容。

这只是允许测试成为受保护的私有数据和方法的桥梁的一种方法。但是,由于这是项目中的所有代码,因此对于您的测试使用来说,这是一种获得测试代码访问权限的合理方法,而无需过多地测试实际代码。

© www.soinside.com 2019 - 2024. All rights reserved.