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获取关于断开连接状态的消息。如果他只得到第一名,或者如果他能按正确的顺序得到三名,我们就没事了。