首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在同一方法上,不同参数匹配的ON_CALL和EXPECT_CALL产生饱和和主动误差。

在同一方法上,不同参数匹配的ON_CALL和EXPECT_CALL产生饱和和主动误差。
EN

Stack Overflow用户
提问于 2019-10-08 10:25:11
回答 1查看 2.3K关注 0票数 0

在下面的示例中,我将获得以下行为:

EXPECT_CALL(barMock,doBar(7)).预期arg #0:等于7实际:5预期:被称为一次实际:调用一次饱和和活动

代码语言:javascript
运行
复制
#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();

}

谷歌测试版本测试:

  • 1.8.0
  • 1.8.1
  1. 这会导致错误吗?
  2. 谷歌测试是如何设置命令调用的?EXPECT_CALL是否只有在这种情况下才具有更高的优先级?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 06:50:46

是的,这是一个错误。GoogleMock策略之一是,在可能出现歧义的情况下,最好是抛出一个错误,让用户明确地声明他的意图。

添加EXPECT_CALL宏可以有效地表示“我关心这个方法的调用”。无论何时设置EXPECT_CALL,GoogleMock都会尝试以相反的声明顺序匹配它所看到的每个EXPECT_CALL (因此,首先匹配最新定义的期望)。

这种设计的原因之一是允许用更具体的期望覆盖不那么具体的期望(例如,在测试夹具的构造函数中,您设置的限制较小的期望值,但对于某些测试,您希望更精确地匹配)。文档

但是,有一种通过添加.RetiresOnSaturation()来“忽略”已经满足的期望的方法

代码语言:javascript
运行
复制
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)调用,那么唯一的方法就是将其定义为期望:

代码语言:javascript
运行
复制
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 (最后一次,先出)处理期望。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58284511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档