有没有什么好的方法对析构函数进行单元测试?就像说我有一个像这样(人为)的例子:
class X
{
private:
int *x;
public:
X()
{
x = new int;
}
~X()
{
delete x;
}
int *getX() {return x;}
const int *getX() const {return x;}
};
有没有什么好的方法可以对它进行单元测试,以确保 x 被删除,而不会用 #ifdef TESTs 弄乱我的 hpp 文件或破坏封装?我看到的主要问题是很难判断 x 是否真的被删除了,特别是因为在调用析构函数时对象超出了范围。
最佳答案
对于依赖注入(inject)可能有些话要说。不是在其构造函数中创建对象(在本例中为 int,但在非人为的情况下更可能是用户定义的类型),而是将对象作为参数传递给构造函数。如果对象是稍后创建的,则将工厂传递给 X 的构造函数。
然后,当您进行单元测试时,您传入一个模拟对象(或创建模拟对象的模拟工厂),析构函数记录它已被调用的事实。如果不是,则测试失败。
当然,您不能模拟(或以其他方式替换)内置类型,因此在这种特殊情况下它不好,但如果您使用接口(interface)定义对象/工厂,那么您可以。
正如其他人所说,在单元测试中检查内存泄漏通常可以在更高级别完成。但这仅检查 a 析构函数是否被调用,并不能证明 right 析构函数被调用。所以它不会,例如在 x 成员类型的析构函数上捕获缺少的“虚拟”声明(同样,如果它只是一个 int,则不相关)。
关于c++ - 单元测试析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/311949/