update / answer: я нашел способ обойти это, извлекая новый класс из B и добавляя помощника для переадресации вызовов на соответствующий метод. Кроме того, также важно использовать ClassMock
вместо InterfaceMock
.
Итак, используя приведенный выше пример, это работает:
struct MockHelper : public B
{
void InvokeRunImpl()
{
B::RunImpl();
}
virtual void MockMe()
{
//never called, but must be defined so MockHelper can be instantiated
}
};
MockHelper* b = mocks.ClassMock< MockHelper >();
auto invokeIt = [b]() { b->InvokeRunImpl(); };
mocks.OnCall( b, MockHelper::RunImpl ).Do( invokeIt );
mocks.OnCall( b, MockHelper::MockMe );
//ok now: calls A::Run, which calls mocked RunImpl, which in turn
//calls InvokeRunImpl, which in turn calls B::RunImpl
b->Run();