我正在使用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/