在所有有关的文档中gmock我总是发现模拟对象在测试中被实例化,如下所示:
TEST(Bim, Bam)
{
MyMockClass myMockObj;
EXPECT_CALL(MyMockObj, foo(_));
...
}
因此,每次测试都会创建和销毁该对象。我相信创建和销毁每个对象也是完全可以的测试治具。但我想知道是否也可以拥有模拟对象的文件全局实例,如下所示:
MyMockClass myMockObj;
TEST(Bim, Bam)
{
EXPECT_CALL(MyMockObj, foo(_))
...
}
我尝试过,到目前为止我绝对没有任何问题,一切似乎都工作正常。但也许我应该知道什么?只是因为我偶然发现这个问题 https://stackoverflow.com/questions/28475881/google-mock-global-mock-object-memory-leak,其中唯一的答案是:
...问题是您正在实例化 FooMock 的全局实例。 Googlemock/googletest 希望模拟在测试主体中或在测试夹具类中定义。
但我在文档或其他任何地方都找不到任何可以证实这一点的内容(我是否忽略了它?)。
谢谢,格奥尔格
PS:我需要使用全局模拟实例的原因将是另一个讨论的主题(请参阅这个帖子 https://stackoverflow.com/a/32274666/5226287我的)。
你可以,但这不是一个好主意。
这样做是违反隔离原则的UT
。
此违规可能会导致测试意外失败/通过。
Gtest
使用假对象的析构函数来验证期望是否发生,这就是每个假对象将在测试主体或测试装置类中创建和释放的期望背后的原因。
如果您将假对象设置为全局,那么它不会在每个对象结束时释放UT
,那么验证就不会执行,即使应该失败,测试也会通过。更多关于你的一些UT
当您一起执行所有测试时,可能会失败/失败;在一次测试中您期望该方法x
不会调用,而在另一种情况下,您希望该方法会调用;在一个 UT 中,您预计方法 x 将调用 3 次,但该方法在测试中被调用两次 + 在其他测试中被调用一次(测试应该失败,但不会......)
因此,最重要的是,您永远不应该使用全局模拟,除非该全局模拟仅用于防止空指针(您没有设置行为..)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)