寻求一种取决于时钟时间的私人会员的方法

时间:2015-08-11 18:48:58

标签: c++ unit-testing googletest

我有一个带有公共方法的类,它将元素添加到私有向量并记录添加每个元素的时间。该类中的另一个公共方法检查向量中的每个元素,并删除超过4小时的元素。

这是班上唯一的公共方法(并且没有公共成员)。

如何使用gtest检查删除功能是否有效? 我不希望测试需要4个小时,我根本不想修改源代码。这甚至可能吗?

更新
GMock可以覆盖用于获取当前时间的方法。在许多情况下,这将是一个解决方案。但是,GMock不适用于自由函数(例如std :: time)。在这种情况下,GMock文档仅建议wrapping the function in a class GMock将是有用的,但是,发现它不适用于自由函数并因此需要模拟STL自由函数或来自C库的函数的许多情况令人失望。 GMock documentation似乎非常清楚这一点,但如果有人碰巧知道这个方法(或没有这个限制的另一个模拟框架)让我知道。

1 个答案:

答案 0 :(得分:1)

你需要让你的课堂可以测试,没有别的办法。即使是最基本的有意义的测试,您也需要展示几件事。

首先,您需要控制附加到元素的时间戳。为此,您需要将一个对象注入到类的构造函数中,该构造函数将返回当前时间,以及:

class YourClass {
    // ...
    shared_ptr<Timer> timer;
public:
    YourClass(shared_ptr<Timer> t) : timer(t) {}
    void addElement(Element e) {
        e.timeAdded(timer->now());
        container.push_back(e);
    }
    // ...
};

通过这种方式,您可以在测试中传入假计时器,这将设置您想要的任何时间。这样你就不必等了。

然后,您需要公开一些接口来检查结果。例如,使用删除旧元素的函数返回删除的元素数量。这将是最简单的方法。

如果您不愿意进行这些或类似的更改,那么您无法以任何有意义的方式测试代码。