在下面的示例中,我将获得以下行为:
EXPECT_CALL(barMock,doBar(7)).预期arg #0:等于7实际:5预期:被称为一次实际:调用一次饱和和活动
#include <gmock/gmock.h>
#include <gtest/gtest.h>
class IBar
{
public:
virtual bool doBar(int barParam) = 0;
};
class BarMock : public IBar
{
public:
MOCK_METHOD1(doBar, bool(int));
};
class Foo
{
public:
Foo(IBar& bar_)
: bar{ &bar_ }
{
}
void doFoo()
{
bar->doBar(7);
bar->doBar(5);
}
IBar* bar;
};
class FooBarTest : public ::testing::Test
{
public:
void SetUp() override
{
ON_CALL(barMock, doBar(testing::_)).WillByDefault(testing::Return(true));
}
testing::NiceMock<BarMock> barMock;
};
TEST_F(FooBarTest, OnCallExpectCallSameMethod)
{
Foo foo(barMock);
ON_CALL(barMock, doBar(5)).WillByDefault(testing::Return(true));
EXPECT_CALL(barMock, doBar(7)).WillOnce(testing::Return(true));
foo.doFoo();
}
谷歌测试版本测试:
发布于 2019-10-10 06:50:46
是的,这是一个错误。GoogleMock策略之一是,在可能出现歧义的情况下,最好是抛出一个错误,让用户明确地声明他的意图。
添加EXPECT_CALL
宏可以有效地表示“我关心这个方法的调用”。无论何时设置EXPECT_CALL
,GoogleMock都会尝试以相反的声明顺序匹配它所看到的每个EXPECT_CALL
(因此,首先匹配最新定义的期望)。
这种设计的原因之一是允许用更具体的期望覆盖不那么具体的期望(例如,在测试夹具的构造函数中,您设置的限制较小的期望值,但对于某些测试,您希望更精确地匹配)。文档。
但是,有一种通过添加.RetiresOnSaturation()
来“忽略”已经满足的期望的方法
TEST_F(FooBarTest, OnCallExpectCallSameMethod)
{
Foo foo(barMock);
ON_CALL(barMock, doBar(5)).WillByDefault(testing::Return(true));
EXPECT_CALL(barMock, doBar(7))
.WillOnce(testing::Return(true))
.RetiresOnSaturation();
foo.doFoo();
}
RetiresOnSaturation()
将使预期在饱和(即被称为预期的时间)之后退休。只要还没有退休的期望,GoogleMock就会跳过退休的期望值(如果所有的人都退休了,那么它仍然会打印错误)。
但是,如果您需要在doBar(5)
之前接受doBar(7)
调用,那么唯一的方法就是将其定义为期望:
TEST_F(FooBarTest, OnCallExpectCallSameMethod)
{
Foo foo(barMock);
EXPECT_CALL(barMock, doBar(5)).WillRepeatedly(testing::Return(true));
EXPECT_CALL(barMock, doBar(7))
.WillOnce(testing::Return(true))
.RetiresOnSaturation();
foo.doFoo();
}
RetiresOnSaturation()
仍然是需要的,因为LIFO (最后一次,先出)处理期望。
https://stackoverflow.com/questions/58284511
复制相似问题