Gmock只需要一个特定的调用
Gmock only expect a specific call
我有一个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));
}
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 构造函数正在调用一个使用当前类类型的函数
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 在另一个线程中调用luaL_error会引发qWarning
- 如何在qt中从另一个类调用函数
- 检查哪个对象调用了另一个对象的对象方法
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 我有一个调用ID3D11DeviceContext::CopySubresourceRegion的循环.我怎么能强制等待
- 当另一个调用 lambda 使用默认捕获时,lambda 的闭包可能会被破坏吗?
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效
- 如何在一个调用中释放多个互斥对象
- 我希望计时器只在上一个调用返回或完成执行时调用代码
- 定义一个调用其他函数的内联函数是否有意义
- 我如何测试一个调用是在谷歌测试延迟后使用嘲讽框架进行的
- 我想创建一个调用函数的源文件,而不必创建对象
- 是否有可能制作一个调用jdbc的Java JNI
- 如果您有一个调用其他内部函数的类接口函数
- 打开文件来自一个调用请求在黑莓10级联
- 创建一个调用另一个可执行文件的可执行文件
- 什么是崩溃我的应用程序的异常,给定一个调用堆栈与UnhandledExceptionFilter