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

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 ...,但是不幸的是,这就是google-mock的工作方式。正如您在他们的FAQ中所读到的:


  在测试的设置部分中拥有ON_CALL并不意味着
  预计会打电话。如果没有EXPECT_CALL并且方法是
  叫做,可能是错误。如果我们悄悄地让电话打通
  在不通知用户的情况下,错误可能会被忽略。


“默认” ON_CALL也是如此-我的意思是当您没有明确编写ON_CALL时,因为类型的默认值(在您的情况下,对于0int)完全可以。

我的建议是始终将这样的一般期望放在测试套件的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));
}

关于c++ - Gmock只期待特定的通话,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33376618/

10-11 20:48