我正在使用Hippomocks,并且具有一个实现通用接口(interface)的类。当我对这个类寄予期望时,我不会得到期望的行为。

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

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.

最佳答案

我很好奇,如果不手动定义所有方法就可以实现Mock(就像其他模拟库一样),但是事实证明它不起作用。 Mock实现采用Undefined Behavior,因为它只是 reinterpret_cast unrelated class to Baz :

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

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

关于c++ - 使用多重继承时为什么我的Hippomock期望失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58233562/

10-16 05:41