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

问题描述 投票:1回答:1

我正在使用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测试公共方法AddParticipant,但是我无法直接访问私有变量user_map_来检查此映射是否按我的预期进行了更改。我不知道这种情况下的最佳做法是什么?我知道一些解决方案:

  1. 使用friend访问ConferenceRoom的私有变量,这将使ConferenceRoom知道测试代码。
  2. user_map_声明为受保护,并且使用TestRoom继承ConferenceRoom,然后在TestRoom中检查地图。
  3. 添加虚拟私有方法const std::unordered_map<uint32_t, User>& GetUserMap() const;使用TestRoom继承ConferenceRoom并覆盖此虚拟方法,然后使用user_map_访问私有GetUserMap

我确定在这种情况下还必须有其他解决方案。在我看来,解决方案应该是将带有测试代码的类ConferenceRoom隔离开,并且可以毫无问题地将类ConferenceRoom交付使用。您的最佳做法是什么?

c++ googletest
1个回答
0
投票

已经使用了this answer中演示的小型模板魔术代码,您可以直接访问私有变量,而无需修改源代码。

对于您的代码,您必须执行以下操作:

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_`

Demo

© www.soinside.com 2019 - 2024. All rights reserved.