我正在尝试使用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
时,因为类型的默认值(在您的情况下,对于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));
}
关于c++ - Gmock只期待特定的通话,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33376618/