使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
What's the best practice to check target object's private variable in unit test code using gtest framework?
我正在使用gtest作为我的单元测试框架。在我的工作中,公共方法修改对象中的一些私有变量是一种常见情况。这些变量存储对象的"状态",并影响对象的行为。例如:
class ConferenceRoom {
public:
void AddUser(const std::string& user_info);
void OnDataReceived(uint32_t user_id, const std::string& message);
private:
// Map[user_id] --> User
std::unordered_map<uint32_t, User> user_map_;
};
我想使用各种好/坏user_info测试公共方法AddUser
,但我无法直接访问私有变量user_map_
以检查此映射是否按预期更改。我不知道这种情况的最佳实践是什么?我知道一些解决方案:
- 使用
friend
访问会议室的私有变量,这将使会议室感知测试代码。 - 将
user_map_
声明为受保护,并使用 TestRoom 继承 ConferenceRoom,然后在 TestRoom 中查看地图。 - 添加虚拟专用方法
const std::unordered_map<uint32_t, User>& GetUserMap() const
;使用 TestRoom 继承 ConferenceRoom 并覆盖此虚拟方法,然后使用GetUserMap
访问专用user_map_
。
我相信这种情况一定还有其他解决方案。在我看来,解决方案应该是用测试代码隔离类ConferenceRoom
,并且类会议室可以清晰地交付使用,没有任何奇怪的代码。您的最佳实践是什么?
使用本答案中已经演示的小模板魔术代码,您可以直接访问私有变量而无需修改源代码。
对于您的代码,您必须执行以下操作:
ALLOW_ACCESS(ConferenceRoom, user_map_, std::unordered_map<uint32_t, User>); // setup
// ... class declarations ...
ConferenceRoom object;
auto& user_map_ = ACCESS(object, user_map_);
// use `user_map_`
演示。
相关文章:
- 在派生类中使用基类的私有成员变量的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 在 gtests 中测试C++全局变量的最佳方法
- 定义常量变量的最佳方法
- 使用虚拟变量对 std::vector 内部循环进行切片的最佳方法
- 用于浮点值的最佳变量类型
- 许多变量,没有嵌套循环的最佳方法
- 最佳多线程全局变量管理
- 避免使用大量全局变量或使其易于访问和修改的最佳方法
- 为单个函数同时声明多个变量的最佳方式是什么
- 成员变量的初始化必须延迟。此类的最佳设计选择是什么?
- 具有许多成员变量的课程的最佳实践
- C++ - 在一个函数/文件中初始化变量然后在main()/另一个文件中使用它的最佳方法是什么?
- 在java/c++/c/actionscript-3应用程序中使用静态变量的最佳方法是什么?
- 这将是在将函数分配给变量或一次又一次地调用函数之间使用函数结果的最佳方式
- 访问成员变量或访问成员函数是最佳选择
- 获取私有实例变量容器成员值的最佳方式
- 布尔变量的最佳大小是多少