如何在单元测试中访问私有成员?

mus*_*nul 3 c++ unit-testing

在开发单元测试时,访问私有成员以检查类的内部状态可能是必要的.有时getter和setter函数不可用,有时它们不公开.

处理它的第一种方法是,编写预处理器定义写入publis而不是private和protected.

#define protected public
#define private public
Run Code Online (Sandbox Code Playgroud)

第二种方法是让测试类成为类的朋友.

class test_foo {
};

class foo {
private:
  int mem;

  friend class test_foo;
};
Run Code Online (Sandbox Code Playgroud)

第三种方法是为测试创建公共接口.

class foo {

#if defined FOO_UNIT_TEST
public:
  int get_mem() const;
#endif

private:
  int mem;
};
Run Code Online (Sandbox Code Playgroud)

除了这些方法之外还有其他方法吗?每种方法都有利有弊.哪一个可以被认为是最佳实践?

谢谢.

Sas*_*ian 6

在我看来,这三种解决方案都很难看.我想说最好的做法是不在单元测试中检查你的类的内部状态,而不是仅仅为单元测试公开方法.这样做违背了TDD的原则.

良好的单元测试不会对内部状态做出任何假设,如果类实现完全改变,则无需修改即可运行.

为什么检查内部状态是必要的?也许你的设计问题可以通过重新设计而不是黑客来解决.你有一个更全面的例子来说明你想要实现的目标吗?