ON_CALL AND EXPECT_CALL 在具有不同参数匹配器的相同方法上生成饱和和主动错误
ON_CALL AND EXPECT_CALL on same method with different parameter matchers generates saturated and active error
在下面的示例中,我将获得以下行为:
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();
}
Google 测试版本测试:
- 1.8.0
- 1.8.1
- 这是为了引起错误吗?
- google 测试如何设置
订购电话? EXPECT_CALL是否只在这个有更高的优先级
场景?
是的,这是一个错误。 GoogleMock 的一项政策是,如果可能出现歧义,最好抛出一个错误,让用户明确说明他的意图。
添加 EXPECT_CALL
宏有效表示 "I care about calls of this method"。每当设置 EXPECT_CALL
时,GoogleMock 将尝试以声明的相反顺序匹配它看到的每个 EXPECT_CALL
(因此首先匹配最新定义的预期)。
这种设计的原因之一是允许用更具体的期望覆盖不太具体的期望(例如,在测试夹具的构造函数中,您设置限制较少的期望,但对于某些测试,您希望更精确地匹配)。 Documentation.
但是,有一种方法 "ignoring" 已经通过添加 .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(后进先出)处理期望。
在下面的示例中,我将获得以下行为:
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();
}
Google 测试版本测试:
- 1.8.0
- 1.8.1
- 这是为了引起错误吗?
- google 测试如何设置 订购电话? EXPECT_CALL是否只在这个有更高的优先级 场景?
是的,这是一个错误。 GoogleMock 的一项政策是,如果可能出现歧义,最好抛出一个错误,让用户明确说明他的意图。
添加 EXPECT_CALL
宏有效表示 "I care about calls of this method"。每当设置 EXPECT_CALL
时,GoogleMock 将尝试以声明的相反顺序匹配它看到的每个 EXPECT_CALL
(因此首先匹配最新定义的预期)。
这种设计的原因之一是允许用更具体的期望覆盖不太具体的期望(例如,在测试夹具的构造函数中,您设置限制较少的期望,但对于某些测试,您希望更精确地匹配)。 Documentation.
但是,有一种方法 "ignoring" 已经通过添加 .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(后进先出)处理期望。