Gmock只需要一个特定的调用

Gmock only expect a specific call

本文关键字:一个 调用 Gmock      更新时间:2023-10-16

我有一个C++类正在尝试用GMock测试。我有以下模拟课程:

class MyTestMock
{
    public:
        MOCK_METHOD1(myCoolMethod, int(const char*));
        MOCK_METHOD1(myCoolMethod, int(string));
}

然后在我的测试中发生以下情况:

MyTestMock myMock;
if ( myMock.myCoolMethod("stuff") )
{
    // Stuff I don't care about, don't want to execute
}
if ( myMock.myCoolMethod("moarStuff") )
{
    // More stuff I don't care about, don't want to execute
}
if ( myMock.myCoolMethod("foo") )
{
    // This I care about and want to execute
}

我想做的是允许前两个调用是不感兴趣的调用,它们返回整数的默认值0,而我在第三个调用上设置了返回1的特定期望值。这是我的尝试:

EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("foo"))).WillOnce(Return(1));

然而,这最终导致测试失败。如果我改为这样做:

EXPECT_CALL(myMock, myCoolMethod(Matcher<const char *>(_))).WillRepeatedly(Return(0));
EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("foo"))).WillOnce(Return(1));

我的考试很好。我正试图在一个旧的、巨大的、单片式的代码库上尽可能轻松地进行单元测试,所以我真的不需要额外的魔术线来告诉它返回默认值。有什么想法可以让我在不破坏测试的情况下,只需一个期望就可以做到这一点?

我想我的答案对于测试"一个旧的、巨大的、单片式的代码库"来说不是很"期望",因为可能有大量这样的CoolMethods。。。,但不幸的是,谷歌mock就是这样运作的。正如你在他们的常见问题解答中所读到的:

在测试的设置部分有ON_CALL并不意味着需要调用。如果没有EXPECT_CALL,并且方法为调用,这可能是一个错误。如果我们悄悄地让电话接通在不通知用户的情况下,错误可能会悄悄出现。

"默认"ON_CALL也是如此——我的意思是,当你没有显式地写ON_CALL时,因为类型的默认值(在你的情况下,0代表int)是完全可以的

我的建议是,在测试套件的SetUp函数中始终放置这样的一般期望——这样,您的测试用例就不会被许多神奇的期望所过载:

class MyTestSuite : public ::testing::Test
{
protected:
    MyTestMock myMock;
    void SetUp() override
    {
        EXPECT_CALL(myMock, myCoolMethod(Matcher<const char *>(_))).WillRepeatedly(Return(0));
    }   
};

通过这种方式,你只在一个地方有"烦人"的行,并且你的测试用例是"清晰的":

TEST_F(MyTestSuite, shallDoSomethingWhenCoolMethodAcceptsFoo)
{
   EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("foo"))).WillOnce(Return(1));
}
TEST_F(MyTestSuite, shallDoSomethingElseWhenCoolMethodAcceptsMoarStuff)
{
   EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("moarStuff"))).WillOnce(Return(1));
}