C++ 为什么我的Hippomock期望在使用多重继承时失败

C++ 为什么我的Hippomock期望在使用多重继承时失败,c++,inheritance,mocking,hippomocks,C++,Inheritance,Mocking,Hippomocks,我正在使用Hippomock,并且有一个实现通用接口的类。当我对这门课寄予期望时,我没有得到期望的行为 这是我的最小“工作”示例 模板 结构Foo{ virtual~Foo()=默认值; 虚拟空心条(常数T&T)=0; }; 结构Baz:公共Foo,公共Foo{ 无效条(常量int&t)覆盖=0; 空栏(常数双&t)覆盖=0; }; 测试用例(“Foo”) { 嘲弄; auto baz=mocks.Mock(); ExpectCall(baz,Foo::bar); baz->bar(12); E

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

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

模板
结构Foo{
virtual~Foo()=默认值;
虚拟空心条(常数T&T)=0;
};
结构Baz:公共Foo,公共Foo{
无效条(常量int&t)覆盖=0;
空栏(常数双&t)覆盖=0;
};
测试用例(“Foo”)
{
嘲弄;
auto baz=mocks.Mock();
ExpectCall(baz,Foo::bar);
baz->bar(12);
ExpectCall(baz,Foo::bar);
baz->bar(234.3);
}
我希望这次考试能顺利通过。但是,测试失败,并显示以下消息(略微编辑以删除项目名称):

test_foo.cpp | 28 |失败:
||由于消息出现意外异常:
||函数调用没有预期!
||期望集:
||测试_foo.cpp(31)
||:对0x0x5569df8f3400处模拟上的Foo::bar(…)的期望值为
||满意。
||测试_foo.cpp(34)
||:对0x0x5569df8f3400处模拟上的Foo::bar(…)的期望值为
||不满意。
我希望调用属于Foo的bar()。

我很好奇
Mock
如何在不手动定义所有方法的情况下实现(就像其他Mock库一样),但结果证明它不起作用<代码>模拟实现使用未定义的行为,因为它只是:

模板
base*MockRepository::Mock(){
mock*m=新的mock(本);
模拟。推回(m);
返回重新解释(m);
}

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

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);
mocks.expectCall重载(baz,static_cast(&baz::bar));
baz->bar(12);
mocks.ExpectCallOverload(baz,static_cast(&baz::bar));
baz->bar(234.3);
语法很糟糕,但现在的行为与预期的一样

我应该有RTFM

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