c++ - 如果私有(private)变量已更改,如何进行单元测试

标签 c++ unit-testing testing mocking googletest

假设我在 C++ 中有这个类:

class ExampleClass{
private:
    int example_var;
public:
    void exampleMethod(){
         example_var = other_value; // other value will be always different
    }
}

如何对 exampleMethod() 进行单元测试?我想做这样的事情:

void testExampleMethod(){
    ExampleClass obj;
    int before_call_value = obj.example_var;
    obj.exampleMethod();
    int after_call_value = obj.example_var;
    ASSERT_NOT_EQUALS(before_call_value, after_call_value);
}

但是 example_var 是私有(private)的。

那么,做这个单元测试的正确方法是什么?如何测试私有(private) example_var 是否已更改?

最佳答案

简短回答:不要这样做。

您的测试应该只针对公共(public)接口(interface)进行测试。让我试着用一些代码来解释:

class Adder {
    int a,b;
public:
    Adder() : a(0),b(0) {}
    void set(int x,int y) { a=x;b=y; }
    int get()             { return a+b; }
};

和一个测试(假设我们可以访问 ab):

void testAdder(){
    Adder add;
    int a = 1;
    int b = 2;
    add.set(a,b);
    ASSERT_EQUALS(add.a,a);
    ASSERT_EQUALS(add.b,b);
    ASSERT_EQUALS(add.get(),a+b);
}

假设您已经分发了代码并且有人正在使用它。他想继续使用它,但提示内存消耗过多。在保持相同的公共(public)接口(interface)的同时解决这个问题很简单:

class Adder {
    int c;
public:
    Adder() : c(0) {}
    void set(int x,int y) { c = x+y; }
    int get()             { return c; }
};

这很简单,但是测试会失败:(

结论:测试私有(private)实现细节违背了测试的目的,因为每次修改代码时,很可能还必须“修复”测试。

关于c++ - 如果私有(private)变量已更改,如何进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45698202/

相关文章:

python - 使用 ctypes : undefined symbol 将 C++ 函数导出到 python

C++ 钻石(多重)虚拟继承中的成员和 vtable 顺序

python - Flask 中 SQLAlchemy 的真实单元测试

python - 为什么 (3.3==np.asarray([3.3])) 等于 [True] 而不是 False?

Angular Testing : provide injected @Attribute in TestBed

testing - 在 Sinatra 中——有人使用测试装置吗?你的测试套件是如何设置的?

c++ - Video4Linux 在开始捕获时崩溃

c++ - 如何在不从谷歌日志记录的情况下运行测试?

java - PowerMockito。模拟静态方法。为什么 PowerMockito#stub 不起作用?

javascript - 我如何测试 Jasmine 中的表单提交?