C++ 如何使用Google测试零或一个函数调用进行检查?
我想编写一个测试,在不同的线程中调用两个函数,我希望根据哪个函数首先工作,可以这样做:C++ 如何使用Google测试零或一个函数调用进行检查?,c++,unit-testing,googletest,googlemock,C++,Unit Testing,Googletest,Googlemock,我想编写一个测试,在不同的线程中调用两个函数,我希望根据哪个函数首先工作,可以这样做: EXPECT_CALL(foo, bar(arg_1)); 或者这个: EXPECT_CALL(foo, bar(arg_1)).RetiresOnSaturation(); EXPECT_CALL(foo, bar(arg_2)).RetiresOnSaturation(); EXPECT_CALL(foo, bar(arg_1)).RetiresOnSaturation(); 正是按照这个顺序。 最简
EXPECT_CALL(foo, bar(arg_1));
或者这个:
EXPECT_CALL(foo, bar(arg_1)).RetiresOnSaturation();
EXPECT_CALL(foo, bar(arg_2)).RetiresOnSaturation();
EXPECT_CALL(foo, bar(arg_1)).RetiresOnSaturation();
正是按照这个顺序。
最简单的方法是什么?我对谷歌测试非常陌生。因为你既不能做模式也不能做条件期望,所以只能选择期望,用arg1设置固定期望,用arg2设置可选(Times(AtMost(1)))期望,将它们按顺序排列,让可选期望添加第三个期望
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class Foo {
public:
MOCK_METHOD1(bar, void(int));
};
class ExpectCall1
{
public:
ExpectCall1(Foo& foo) : foo_(foo) {}
void operator()()
{
EXPECT_CALL(foo_, bar(1)).Times(1);
}
private:
Foo& foo_;
};
class Demo : public ::testing::Test
{
virtual void SetUp()
{
::testing::InSequence dummy;
EXPECT_CALL(foo_, bar(1)).Times(1);
EXPECT_CALL(foo_, bar(2)).Times(::testing::AtMost(1)).
WillOnce(::testing::InvokeWithoutArgs(ExpectCall1(foo_)));
}
protected:
Foo foo_;
};
TEST_F(Demo, Success1)
{
foo_.bar(1);
}
TEST_F(Demo, Success2)
{
foo_.bar(1);
foo_.bar(2);
foo_.bar(1);
}
TEST_F(Demo, Fail1)
{
foo_.bar(1);
foo_.bar(1);
}
TEST_F(Demo, Fail2)
{
foo_.bar(1);
foo_.bar(2);
}
TEST_F(Demo, Fail3)
{
foo_.bar(1);
foo_.bar(1);
foo_.bar(2);
}
#包括
#包括
福班{
公众:
模拟方法1(条形、空心(int));
};
类ExpectCall1
{
公众:
ExpectCall1(Foo&Foo):Foo_(Foo){}
void运算符()()
{
期望调用(foo,bar(1))。次(1);
}
私人:
富和富;
};
类Demo:public::testing::Test
{
虚拟空间设置()
{
::测试::不连续假人;
期望调用(foo,bar(1))。次(1);
EXPECT_调用(foo_,bar(2)).Times(::testing::AtMost(1))。
WillOnce(::testing::InvokeWithoutArgs(ExpectCall1(foo_));
}
受保护的:
富富!;
};
测试(演示,成功1)
{
富吧(1);;
}
测试(演示,成功2)
{
富吧(1);;
福巴(2);
富吧(1);;
}
测试(演示,失败1)
{
富吧(1);;
富吧(1);;
}
测试(演示,失败2)
{
富吧(1);;
福巴(2);
}
测试(演示,失败3)
{
富吧(1);;
富吧(1);;
福巴(2);
}
您的问题不清楚。什么是foo
和bar
?什么是arg_1
和arg_2
?我希望取决于哪个函数首先起作用,这意味着什么?@srikan问题在和的上下文中很清楚(以及foo
和bar
是什么)。好的,如果这有助于理解问题,我会给他们起名字。我调用对象foo的ProcessRequest()和OnConnectionStatusChange(bool isConnected)方法。如果我们已连接,则Foo::ProcessRequest()必须通过函数栏(字符串msg)返回答案。若我们并没有连接,它也会返回答案(从缓存中),然后发送消息通知我们数据可能已经过时。OnConnectionStatusChange(true)发送关于恢复以前请求的连接的消息。所以我担心的是重新连接和请求之间的竞争。客户机不应该按如下顺序获取消息:首先,他在请求时获取答案,然后从OnConnectionStatusChange获取关于重新连接的消息,然后从ProcessRequest获取关于断开连接状态的消息。如果他只得到第一名,或者如果他能按正确的顺序得到三名,我们就没事了。