c++ - 单元测试析构函数?

标签 c++ unit-testing destructor cppunit

有没有什么好的方法对析构函数进行单元测试?就像说我有一个像这样(人为)的例子:

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/

相关文章:

C++ 标准库串行端口 (UART) 接口(interface)

c++ - 在 ubuntu 中用 clang 编译 R 包

java - 对文件存在的不同行为进行单元测试

python - Django 单元测试和全局固定装置

c++ - 为什么正则表达式析构函数中存在存储错误?

c++ - 有没有一种特殊的方法来声明/定义 C++ 构造函数(和析构函数)

c++ - 在QT中,如何在收到子部件产生的信号后从父部件中删除子部件?

c++ - 方法参数列表中的错误

objective-c - 将 Swift 单元测试添加到混合语言 Xcode 项目

PHP 析构函数