1

我正在使用 Hippomocks 并有一个实现通用接口的类。当我对这门课寄予期望时,我没有得到预期的行为。

这是我最小的“工作”示例

template <class T>
struct Foo {
  virtual ~Foo() = default;
  virtual void bar(const T& t) = 0;
};

struct Baz : public Foo<int>, public Foo<double> {
  void bar(const int& t) override = 0;
  void bar(const double& t) override = 0;
};

TEST_CASE("Foo")
{
  MockRepository mocks;

  auto baz = mocks.Mock<Baz>();

  mocks.ExpectCall(baz, Foo<int>::bar);
  baz->bar(12);

  mocks.ExpectCall(baz, Foo<double>::bar);
  baz->bar(234.3);
}

我希望这个测试能够顺利通过。但是测试失败并显示以下消息(稍作编辑以删除项目名称):

test_foo.cpp|28| FAILED:
|| due to unexpected exception with message:
||   Function called without expectation!
||   Expectations set:
||   test_foo.cpp(31)
||   : Expectation for Foo<int>::bar(...) on the mock at 0x0x5569df8f3400 was
||   satisfied.
||   test_foo.cpp(34)
||   : Expectation for Foo<double>::bar(...) on the mock at 0x0x5569df8f3400 was
||   not satisfied.
I am expecting the bar() belonging to Foo<double> to be invoked.
4

2 回答 2

1

我很好奇如何Mock在不手动定义所有方法的情况下实现(就像其他模拟库一样),但事实证明它不起作用。Mock实现采用未定义行为,因为它只是reinterpret_cast与类无关Baz

template <typename base>
base *MockRepository::Mock() {
    mock<base> *m = new mock<base>(this);
        mocks.push_back(m);
    return reinterpret_cast<base *>(m);
}

它会做各种其他俗气的事情,比如弄乱 vtable。这些东西都不能可靠地工作。

于 2019-10-04T09:39:40.220 回答
0

Hippomocks 负责处理类函数重载的情况。

我应该使用的期望如下

  mocks.ExpectCallOverload(baz, static_cast<void (Baz::*)(const int&)>(&Baz::bar));
  baz->bar(12);

  mocks.ExpectCallOverload(baz, static_cast<void (Baz::*)(const double&)>(&Baz::bar));
  baz->bar(234.3);

语法很糟糕,但现在它的行为符合预期。

我应该有RTFM...

于 2019-10-04T10:12:42.180 回答