GoogleMock:预计会有两个方法调用

时间:2015-02-02 13:26:04

标签: c++ testing mocking googlemock

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

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();
}

但是,这并不会验证是否调用了bar1->frob()bar2->frob(),只是不会多次调用它们。

GoogleMock是否有办法针对一组期望测试最少数量的来电,例如我可以在Times()上调用的ExpectationSet功能?

1 个答案:

答案 0 :(得分:3)

这可以使用check points

来实现
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));