假设我在 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; }
};
和一个测试(假设我们可以访问 a
和 b
):
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/