【发布时间】:2015-10-14 12:56:56
【问题描述】:
我有两个共享某些状态的单元测试(不幸的是,我无法更改这一点,因为重点是测试对这个状态的处理)。
TEST(MySuite, test1)
{
shared_ptr<MockObject> first(make_shared<MockObject>());
SubscribeToFooCallsGlobal(first);
EXPECT_CALL(*first, Foo(_));//.RetiresOnSaturation();
TriggerFooCalls(); // will call Foo in all subscribed
}
TEST(MySuite, test2)
{
shared_ptr<MockObject> second(make_shared<MockObject>());
SubscribeToFooCallsGlobal(second);
EXPECT_CALL(*second, Foo(_)).Times(1);
TriggerFooCalls(); // will call Foo in all subscribed
}
如果我分别运行测试,两者都是成功的。如果我按 test1、test2 的顺序运行它们,我会在 test2 中得到以下错误:
mytest.cpp(42):错误:模拟函数调用的次数比预期的多 - 直接返回。 函数调用:Foo(0068F65C) 预期:被调用一次 实际:调用两次 - 过饱和和活跃失败的期望是 test1 中的期望。调用确实发生了,但我想告诉 GoogleMock 在test1 完成后不在乎(实际上,我只想在测试运行时检查测试中的期望值)。
我的印象是 RetiresOnSaturation 会这样做,但有了它我得到:
我不得不承认,这让我很困惑。这是什么意思?我该如何解决这个问题?
【问题讨论】:
-
`SubscribeToFooCallsGlobal(first);` - 您可能必须在每个 TC 结束时取消订阅。
-
@PiotrNycz 当然,但这是一种解决方法。为什么 GoogleMock 在测试运行后仍然检查调用?
-
因为全局变量是全局变量。因此(那些全局变量)在 a*s 中很痛苦 - 没有人也没有任何东西(包括 gtest)可以正确处理全局变量
-
@PiotrNycz 我的观点是:为什么 GoogleMock 在测试用例运行后不清除预期?我怎样才能把它们说清楚?对我来说,在测试用例完成运行后将它们保留在适当的位置是没有意义的。
-
您的模拟仍然存在(由您的全局成员保存为
std::shared_ptr) - 那么,根据您的说法,gmock 将如何识别他们不应参与下一次测试?我的意思是他们被订阅了——所以他们被调用了——但他们预计只会被调用一次
标签: c++ unit-testing googletest googlemock