编写可以访问 private/protectedstate 的单元测试
Writing unit tests which may access private/protectedstate
我使用 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
或使用朋友关系,我也无法从每个单独的测试中访问 private/protected methods/state:
BOOST_FIXTURE_TEST_CASE(test1, TestFixture)
{
_bla.doSomething();
BOOST_REQUIRE_EQUAL(_bla.x, 10); // Compiler error. I cannot access ClassBeingTested::_x here
}
仅夹具,这意味着我必须为我希望进行的每个访问添加一个新的 getter(或测试)。
有什么办法可以实现吗?我必须向 ClassBeingTested
添加 public getter 方法,这些方法仅供测试使用,这并不理想。
(请不要回复 'test using the public interface',这并不总是可能的)。
你可以在class ClassBeingTested
.
中与friend struct ClassBeingTestedBuddy;
交个朋友测试好友,struct ClassBeingTestedBuddy;
让测试伙伴 class 公开所有测试所需的所有受保护或私有变量或方法。
它看起来像...
struct ClassBeingTestedBuddy {
ClassBeingTested* obj;
ClassBeingTestedBuddy(ClassBeingTested* obj_)
: obj{obj_} {}
};
...加上您想要公开的任何其他内容。
这只是让测试成为通往受保护和私有数据和方法的桥梁的一种方式。但由于它是您项目中的所有代码,为了您的测试使用,这是一种无需过多检测您的实际代码即可访问测试代码的合理方法。
我使用 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
或使用朋友关系,我也无法从每个单独的测试中访问 private/protected methods/state:
BOOST_FIXTURE_TEST_CASE(test1, TestFixture)
{
_bla.doSomething();
BOOST_REQUIRE_EQUAL(_bla.x, 10); // Compiler error. I cannot access ClassBeingTested::_x here
}
仅夹具,这意味着我必须为我希望进行的每个访问添加一个新的 getter(或测试)。
有什么办法可以实现吗?我必须向 ClassBeingTested
添加 public getter 方法,这些方法仅供测试使用,这并不理想。
(请不要回复 'test using the public interface',这并不总是可能的)。
你可以在class ClassBeingTested
.
friend struct ClassBeingTestedBuddy;
交个朋友测试好友,struct ClassBeingTestedBuddy;
让测试伙伴 class 公开所有测试所需的所有受保护或私有变量或方法。
它看起来像...
struct ClassBeingTestedBuddy {
ClassBeingTested* obj;
ClassBeingTestedBuddy(ClassBeingTested* obj_)
: obj{obj_} {}
};
...加上您想要公开的任何其他内容。
这只是让测试成为通往受保护和私有数据和方法的桥梁的一种方式。但由于它是您项目中的所有代码,为了您的测试使用,这是一种无需过多检测您的实际代码即可访问测试代码的合理方法。