我正在使用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_
来检查此映射是否按我的预期进行了更改。我不知道这种情况下的最佳做法是什么?我知道一些解决方案:
friend
访问ConferenceRoom的私有变量,这将使ConferenceRoom知道测试代码。user_map_
声明为受保护,并且使用TestRoom继承ConferenceRoom,然后在TestRoom中检查地图。const std::unordered_map<uint32_t, User>& GetUserMap() const
;使用TestRoom继承ConferenceRoom并覆盖此虚拟方法,然后使用user_map_
访问私有GetUserMap
。我确定在这种情况下还必须有其他解决方案。在我看来,解决方案应该是将带有测试代码的类ConferenceRoom
隔离开,并且可以毫无问题地将类ConferenceRoom交付使用。您的最佳做法是什么?
已经使用了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_`