使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?

What's the best practice to check target object's private variable in unit test code using gtest framework?

本文关键字:变量 最佳 是什么 目标对象 框架 gtest 单元测试 代码 检查 使用      更新时间:2023-10-16

我正在使用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_以检查此映射是否按预期更改。我不知道这种情况的最佳实践是什么?我知道一些解决方案:

  1. 使用friend访问会议室的私有变量,这将使会议室感知测试代码。
  2. user_map_声明为受保护,并使用 TestRoom 继承 ConferenceRoom,然后在 TestRoom 中查看地图。
  3. 添加虚拟专用方法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_`

演示。