给出以下两个类:
class Base
{
public:
virtual void doSmt(void);
}
class Derived : public Base
{
void doSmt(void) { Base::doSmt(); }
}
我要测试的课程是Derived
。但我不想深入Base
,我只想检查在doSmt()
内调用Base的调用
这样的事情:
TEST_F(Derived, DoSmt)
{
EXPECT_CALL(Base, doSmt()).Times(1);
testedInstance.doSmt();
}
因为我已经测试了Base,而Base继承了2个类。
有什么办法吗?
答案 0 :(得分:1)
我被指派为gmock旁边的“邪恶”设计写单元测试。从一开始它比我更难,但我也有自己的解决方案。
虽然比我简单(再次:D)
1.插入基类头中需要的任何模拟。或者您可以创建一个新的并指定其路径包含。
class Base
{
public:
MOCK_METHOD0(mock_doSmt, void());
void doSmt(void);
}
2.要调用Base模拟方法,只需创建BaseStub.cpp
此源仅用于模拟。所以,你必须编译&与BaseStub.cpp
而非Base.cpp
void Base::doSmt(void) { mock_doSmt(); }
3.测试时
EXPECT_CALL(*reinterpret_cast<Base*>(&derivedInstance), mock_doSmt()).Times(1);
mock_doSmt 而不是 doSmt
这种方式也可以解决Singleton问题。像上面一样创建SingletonStub,并在SetUp()中创建singletonInstance = Singleton::getInstance();
请记住:这样,您有2个来源和2个标题。
面对这个傻瓜时,我发现应该使用#include <...>
代替#include "..."
因为当你指定include dir时,#include <...>
会让你更有控制力。
另一个我想分享的重要事项是
不要抽象你的OOP。原因在此之后,你(或你的同事)会遇到很大麻烦。不要继承超过2级,只有1个接口和1个继承。
答案 1 :(得分:0)
正如所写,没有(直接)方式来模拟对Base::doSmt()
的显式调用。在不知道如何使用Base
类的上下文的情况下很难做出判断调用,但我的猜测是,通过使用组合而不是继承来重用{{1}提供的功能,可以更好地服务}}。这会使测试类依赖于Base
更容易,因为您可以简单地将模拟Base
类注入Base
并验证Derived
被正确调用。