gpt4 book ai didi

c++ - 谷歌模拟 : Is it ok to use global mock objects?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:17 24 4
gpt4 key购买 nike

在所有关于gmock 的文档中,我总是发现要在测试中实例化模拟对象,就像这样:

TEST(Bim, Bam)
{
MyMockClass myMockObj;
EXPECT_CALL(MyMockObj, foo(_));
...
}

因此,对象在每次测试时都会被创建和销毁。我相信为每个测试夹具 创建和销毁对象也完全没问题。但我想知道是否也可以拥有模拟对象的文件全局实例,就像这样:

MyMockClass myMockObj;

TEST(Bim, Bam)
{
EXPECT_CALL(MyMockObj, foo(_))
...
}

我试过了,到目前为止我完全没有问题,一切似乎都很好。但也许我应该知道什么?只是因为我偶然发现了 this question ,其中唯一的答案是:

... the problem is that you're instantiating a global instance of FooMock. Googlemock/googletest expect the mock to be defined either within the body of the test, or within a test fixture class.

但我无法在文档或其他任何地方找到任何证实这一点的内容(我忽略了吗?)。

谢谢,乔治

PS:我需要使用全局模拟实例的原因将是另一个讨论的主题(参见我的 this posting)。

最佳答案

可以,但这不是一个好主意。

这样做违反了UT的隔离原则。这种违规行为可能会导致您的测试意外失败/通过。

Gtest 使用假对象的析构函数来验证预期是否发生,这就是预期每个假对象将在测试主体中创建和释放的原因,或者在一个测试夹具类。

如果您将伪造对象设置为全局对象,则它不会在每个 UT 结束时释放,那么验证将不会执行,即使它应该失败,测试也会通过。更重要的是,当您一起执行所有测试时,您的一些 UT 可能会失败/失败;在一个测试中,您希望方法 x 不会调用,而在另一个测试中,您希望该方法会调用;在一个 UT 中,您期望方法 x 将调用 3 次,但该方法在测试中调用了两次 + 在其他测试中调用了一次(测试应该失败但不会...)

所以最重要的是你永远不应该使用全局模拟,除非这个全局模拟只是为了防止空指针(你没有设置行为..)

关于c++ - 谷歌模拟 : Is it ok to use global mock objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32266610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com