C++ GoogleMock:需要两个方法调用中的任意一个

C++ GoogleMock:需要两个方法调用中的任意一个,c++,testing,mocking,googlemock,C++,Testing,Mocking,Googlemock,我有一个类Foo,它引用了类型为IBar的多个其他对象。该类有一个方法fun,该方法需要在至少一个IBars上调用方法frob。我想用mockedIBars编写一个测试来验证这个需求。我在用谷歌模拟。我目前有: class IBar { public: virtual void frob() = 0; }; class MockBar : public IBar { public: MOCK_METHOD0(frob, void ()); }; class Foo { std::share

我有一个类
Foo
,它引用了类型为
IBar
的多个其他对象。该类有一个方法
fun
,该方法需要在至少一个
IBar
s上调用方法
frob
。我想用mocked
IBar
s编写一个测试来验证这个需求。我在用谷歌模拟。我目前有:

class IBar { public: virtual void frob() = 0; };
class MockBar : public IBar { public: MOCK_METHOD0(frob, void ()); };

class Foo {
  std::shared_ptr<IBar> bar1, bar2;
public:
  Foo(std::shared_ptr<IBar> bar1, std::shared_ptr<IBar> bar2)
      : bar1(std::move(bar1)), bar2(std::move(bar2))
  {}
  void fun() {
    assert(condition1 || condition2);
    if (condition1) bar1->frob();
    if (condition2) bar2->frob();
  }
}

TEST(FooTest, callsAtLeastOneFrob) {
  auto bar1 = std::make_shared<MockBar>();
  auto bar2 = std::make_shared<MockBar>();
  Foo foo(bar1, bar2);

  EXPECT_CALL(*bar1, frob()).Times(AtMost(1));
  EXPECT_CALL(*bar2, frob()).Times(AtMost(1));

  foo.fun();
}
类IBar{public:virtualvoidfrob()=0;};
类MockBar:public IBar{public:MOCK_METHOD0(frob,void());};
福班{
std::shared_ptr bar1、bar2;
公众:
Foo(std::shared_ptr bar1,std::shared_ptr bar2)
:bar1(标准::移动(bar1)),bar2(标准::移动(bar2))
{}
虚无乐趣(){
断言(条件1 | |条件2);
如果(条件1)bar1->frob();
如果(条件2)bar2->frob();
}
}
测试(最足部、呼叫至少到EFROB){
auto bar1=std::make_shared();
auto bar2=std::make_shared();
富富(bar1、bar2);
EXPECT_调用(*bar1,frob())。次(AtMost(1));
EXPECT_调用(*bar2,frob())。次(AtMost(1));
foo.fun();
}
但是,这并不验证是否调用了
bar1->frob()
bar2->frob()
,只验证两个函数都没有被多次调用


在GoogleMock中是否有一种方法可以测试对一组期望值的最小调用次数,例如我可以对
期望集调用的
Times()
函数?

这可以通过以下方法实现:

使用::testing::MockFunction;
模拟功能检查点;
EXPECT_调用(*bar1,frob())
.次(大气(1))
威尔先生(
InvokeWithoutArgs(&check_-point,&MockFunction::Call);
EXPECT_调用(*bar2,frob())
.次(大气(1))
威尔先生(
InvokeWithoutArgs(&check_-point,&MockFunction::Call);
期望调用(检查点,调用())
.次(正是(1));

考虑将其分为两个测试:每个条件一个。在前两个
EXPECT\u CALL的
中重复添加缺少的右括号
using ::testing::MockFunction;

MockFunction<void()> check_point;
EXPECT_CALL(*bar1, frob())
    .Times(AtMost(1))
    .WillRepeatedly(
        InvokeWithoutArgs(&check_point, &MockFunction<void()>::Call);
EXPECT_CALL(*bar2, frob())
    .Times(AtMost(1))
    .WillRepeatedly(
        InvokeWithoutArgs(&check_point, &MockFunction<void()>::Call);
EXPECT_CALL(check_point, Call())
    .Times(Exactly(1));