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. 这是为了引起错误吗?
  2. 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(后进先出)处理期望。