我有一个包含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测试框架。
答案 0 :(得分:4)
您无法将静态局部变量重置为声明它的函数范围。
我会尝试在没有静态本地的情况下实现你的MyClass::createDirectory
函数,即使它需要重新定义函数的签名甚至整个类的接口。
答案 1 :(得分:0)
虽然当前接受的答案有效,但也可以验证createDirectory()
方法的行为,而无需重构以删除静态变量。由于createDirectory()
返回一个字符串,因此使用正则表达式来验证函数返回的目录名是相当简单的。例如,如果目标是验证createDirectory()
的后续调用是否返回带有顺序递增序列号的目录名,则可以编写一个调用createDirectory()
两次的测试。在这两种情况下,您将使用正则表达式捕获序列号,并比较它们以确保第二次调用产生的序列号大于第一次。这样,您可以在不依赖于特定值的情况下测试功能。
如果您还没有,请查看googlemock的正则表达式匹配器和ASSERT_THAT()
宏。在这些情况下,两者都非常有用。
答案 2 :(得分:-2)
我没有使用googletest
框架(虽然我希望可以)。
Google快速向我提供以下信息,这些信息直接相关,可以为您提供很多帮助。
即,您应该在每次测试运行时设置对象,在静态方法中,您通常需要reset()
或类似于记住每次运行后它应该是什么样。无需创建新实例。
类似于jUnit的设置和拆解。
编辑:我刚刚意识到你可能要求的不同于我正在谈论的事情。每次运行时static unsigned int i = 0;
不应该将其设置为0
吗?我不确定googletest
是否是目的行为。