是否可以在谷歌模拟中做出范围的期望

Is it possible to make scoped expectations in Google Mock?

本文关键字:范围 期望 模拟 谷歌 是否      更新时间:2023-10-16

是否可以使用Google Mock确定期望的范围?换句话说,假设我有以下测试夹具:

class Fixture : public testing::Test
{
public:
    void SetUp();
    void TearDown();
    ObjectUnderTest testObject;
    MockObject mock;
};

现在,在SetUp()函数中,我想允许在初始化期间根据需要调用模拟函数的次数:

void Fixture::SetUp()
{
    EXPECT_CALL(mock.DoStuff(_)).Times(Any());
    testObject.Initialise(mock);
}

在此之后,我希望这个特定的期望超出范围,并且任何对DoStuff()调用都会产生失败。我不能使用RetiresOnSaturation()因为它永远不会饱和!

换句话说,如果我有以下测试用例:

TEST_F(Fixture, DoesWhatItsSupposedTo)
{
    EXPECT_CALL(mock, DoStuff(Eq(3)));
    testObject.DoSomething(mock);
}

如果DoSomething()对模拟对象调用DoStuff(4),我希望此操作失败。使用 gmock 默认行为(适用于大多数场景),它将首先检查不匹配的第二个期望;然后,它将检查匹配并通过的SetUp()的期望。

有谁知道这是否可能?

这可能不是您的问题的真正答案,但您可以使用.Times(0)明确禁止呼叫:

TEST_F(Fixture, DoesWhatItsSupposedTo)
{
    EXPECT_CALL(mock, DoStuff(Eq(3)));
    EXPECT_CALL(mock, DoStuff(Ne(3)))
            .Times(0);
    testObject.DoSomething(mock);
}

在此测试中,这将期望一次DoStuff(3)调用,而没有其他DoStuff()调用 - 首先根据DoStuff(Ne(3))检查任何调用。在测试之前,任何电话仍将被接受。