c++ - 如何对 C++ 类的私有(private)成员(和方法)进行单元测试

标签 c++ unit-testing private-members private-methods

我正在尝试对名为 VariableImpl 的 C++ 类进行单元测试(使用 Boost 单元测试框架)。以下是详细信息。

class Variable
{
public:
  void UpdateStatistics (void) {
    // compute mean based on m_val and update m_mean;
    OtherClass::SendData (m_mean);
    m_val.clear ();
  }
  virtual void RecordData (double) = 0;

protected:
  std::vector<double> m_val;

private:
  double m_mean;
};

class VariableImpl : public Variable
{
public:
  virtual void RecordData (double d) {
    // put data in m_val
  }
};

我的问题是如何检查平均值是否正确计算?请注意,1) m_mean 受到保护,2) UpdateStatistics 调用另一个类的方法,然后清除 vector 。

我能看到的唯一方法是添加一个 getter(例如,GetMean),但我根本不喜欢这个解决方案,我认为它也不是最优雅的。

我该怎么办?

如果我要测试私有(private)方法而不是私有(private)变量,我该怎么办?

最佳答案

嗯,unit 测试应该测试units,理想情况下,每个类都是一个独立的单元——这直接遵循单一职责原则。

因此,测试类的私有(private)成员应该是不必要的 - 类是一个黑盒子,可以按原样在单元测试中覆盖。

另一方面,这并不总是正确的,有时是有充分理由的(例如,类的几个方法可能依赖于应该测试的私有(private)实用函数)。一个非常简单、非常笨拙但最终成功的解决方案是将以下内容放入您的单元测试文件中,before 包括定义您的类的 header :

#define private public

当然,这会破坏封装并且是邪恶的。但是对于测试来说,它是有目的的。

关于c++ - 如何对 C++ 类的私有(private)成员(和方法)进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6778496/

相关文章:

c++ - 第二次在图上运行时,广度/深度优先搜索会导致崩溃

c++ - std::vector 和多维数组的连续内存

c++ - 编译使用 OpenGL 的代码时找不到 libGLESv2.dll

python - 针对多个类名的 assertIsInstance()

java - RenderScript 支持库出现 IllegalAccessError

c++ - 静态常量 std::vector

C++/Eclipse 共享库 : Why can g++ not find this library?

unit-testing - 如何测试科学软件?

javascript - JS/ECMAScript6 私有(private)字段的模式与 let?

C#结合MSIL——JIT跳过验证