gtest测试单例类
时间: 2024-12-28 12:15:36 浏览: 11
### 使用 GTest 对单例模式类进行单元测试
对于单例模式的类,由于其全局唯一实例的特点,在对其进行单元测试时需要特别注意初始化和清理工作。下面展示了一个简单的例子,说明如何使用 `gtest` 来测试一个实现了单例模式的类。
#### 定义 Singleton 类
首先定义一个遵循单例设计模式的 C++ 类:
```cpp
// singleton.h
#ifndef SINGLETON_H_
#define SINGLETON_H_
class Singleton {
public:
static Singleton* GetInstance() {
if (instance_ == nullptr) {
instance_ = new Singleton();
}
return instance_;
}
void SetValue(int value) { value_ = value; }
int GetValue() const { return value_; }
private:
Singleton() : value_(0) {}
~Singleton() {}
static Singleton* instance_;
int value_;
};
Singleton* Singleton::instance_ = nullptr;
#endif // SINGLETON_H_
```
为了能够有效地对这个类进行测试,通常建议提供一种方式可以在每次运行测试前重置或销毁当前存在的单例实例。这可以通过修改上述实现中的析构函数以及添加额外的功能来完成,比如通过友元声明让特定的测试代码访问私有成员。
#### 编写测试用例
接下来编写针对 `Singleton` 的测试用例文件如下所示:
```cpp
// test_singleton.cpp
#include "singleton.h"
#include <gtest/gtest.h>
namespace {
/// @brief 清理已有的单例实例.
void CleanupSingleton() {
delete Singleton::GetInstance(); // 假设允许这样做用于测试目的
Singleton::instance_ = nullptr;
}
} // namespace
TEST(SingletonTest, BasicFunctionality) {
auto s1 = Singleton::GetInstance();
EXPECT_EQ(s1->GetValue(), 0);
s1->SetValue(42);
EXPECT_EQ(s1->GetValue(), 42);
auto s2 = Singleton::GetInstance();
EXPECT_EQ(s2->GetValue(), 42); // 验证确实只有一个实例存在
CleanupSingleton(); // 测试结束后清除资源[^1]
}
```
在这个例子中,`CleanupSingleton()` 函数用来确保在每个测试之后都能恢复干净的状态以便后续其他测试能正常运作。需要注意的是实际项目里可能不允许直接删除单例对象,因此这里仅作为教学用途展示了这种做法。
阅读全文