Google测试和静态本地变量

时间:2015-07-27 09:51:20

标签: c++ unit-testing static static-members googletest

我有一个包含static unsigned int的方法,因此它可以返回连续的目录名。类似的东西:

string MyClass::createDirectory() const
{
    static unsigned int i = 0;
    stringstream ss;
    string directory;
    do
    {
        ++i;
        ss.str("");
        ss << "/" << setfill('0') << setw(6) << i;
        directory = m_rootDirectory + ss.str();

    } while(!m_filesystem->createDirectory((directory)));

    return directory;
}

我知道这是非常天真的解决方案,但现在已经足够好了。

但是我在编写单元测试时遇到了问题 - 静态变量在测试用例之间递增。

有没有办法重置这样的变量?或者是将静态方法变量更改为非静态类成员我唯一的选择?

我正在使用Google测试框架。

3 个答案:

答案 0 :(得分:4)

您无法将静态局部变量重置为声明它的函数范围。

我会尝试在没有静态本地的情况下实现你的MyClass::createDirectory函数,即使它需要重新定义函数的签名甚至整个类的接口。

答案 1 :(得分:0)

虽然当前接受的答案有效,但也可以验证createDirectory()方法的行为,而无需重构以删除静态变量。由于createDirectory()返回一个字符串,因此使用正则表达式来验证函数返回的目录名是相当简单的。例如,如果目标是验证createDirectory()的后续调用是否返回带有顺序递增序列号的目录名,则可以编写一个调用createDirectory()两次的测试。在这两种情况下,您将使用正则表达式捕获序列号,并比较它们以确保第二次调用产生的序列号大于第一次。这样,您可以在不依赖于特定值的情况下测试功能。

如果您还没有,请查看googlemock的正则表达式匹配器和ASSERT_THAT()宏。在这些情况下,两者都非常有用。

答案 2 :(得分:-2)

我没有使用googletest框架(虽然我希望可以)。

Google快速向我提供以下信息,这些信息直接相关,可以为您提供很多帮助。

If you find yourself writing two or more tests that operate on similar data, you can use a test fixture. It allows you to reuse the same configuration of objects for several different tests.

即,您应该在每次测试运行时设置对象,在静态方法中,您通常需要reset()或类似于记住每次运行后它应该是什么样。无需创建新实例。

类似于jUnit的设置和拆解。

编辑:我刚刚意识到你可能要求的不同于我正在谈论的事情。每次运行时static unsigned int i = 0;不应该将其设置为0吗?我不确定googletest是否是目的行为。