2011-05-28 114 views
1

我目前使用HippoMocks作为嘲讽框架,并且无法弄清楚如何在下面的代码中模拟纯虚拟方法MockMe()。我做不是想嘲笑任何非虚拟方法(这可能甚至不可能),而是我希望他们做他们的意思,并调用虚拟的虚拟方法。如果类也有非虚拟方法,嘲弄纯虚拟方法?

struct A 
{ 
    void Run() { RunImpl(); } 
    virtual void RunImpl() = 0; 
}; 

struct B : public A 
{ 
    //implement A::RunImpl 
    void RunImpl() { MockMe(); } 

    //this one I want to mock 
    virtual void MockMe() = 0; 
}; 

MockRepository mocks; 
B* b = mocks.InterfaceMock<B>(); 
mocks.OnCall(b, B::MockMe); 
b->Run(); //throws NotImplementedException for Run() 

有没有什么办法让这个与HippoMocks工作?或者与另一个框架?或者修改了一些源代码?

回答

0

更新/回答:我通过从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(); 
+1

如果您对C++ 0x解决方案没有问题,则应该将该标记添加到您的问题中。 – 2011-06-26 09:37:36

+0

完成..可以用'标准'C++完成课程但这是更多的打字; P – stijn 2011-06-26 16:15:53

0

我没有用嘲讽的框架,但是这应该是比较容易做的事情之一......

扩展B类与Mock类,在这里你只覆盖纯虚方法和向前构造函数。然后实例化派生类并将其作为引用/指针传递给模拟类,这是应用程序的其余部分可能已准备好处理的事情:如果类具有纯虚函数,那么应用程序将通过指针以多态方式使用它和/或参考。

+0

我看了你的答案了几次,但没能明白你的意思]你能提供一些小样本代码? – stijn 2011-05-29 10:17:18