如何测试在C++中实例化非模拟类的类方法



这是我在UniTesting的第一次体验,在开发测试时让我头疼,如果你能帮忙的话,那就太好了。

我的程序中有这样的东西:

class Baseclass
{
public: 
Baseclass(Class2 arg) { mProperty = arg};
void doSomething();
void doSomethingElse();
private:
Class2 mProperty;
}
class Class1
{
public:
bool doClass1Stuff();
...
}
class Class2
{
public:
bool doClass2Stuff();
Class1* getClass1(){return mClass1;};
...
private:
Class1* mClass1; 
}

我正在使用GoogleTest和gMock编写测试:

class MockClass1 : public Class1
{
public:
MOCK_METHOD(bool, doClass1Stuff,());
};
class MockClass2 : public Class2
{
public:
MOCK_METHOD(MockClass1*, getClass1,());
}

当测试BaseClass的方法时,我无法解决这样的问题:

double BaseClass::methodToTest()
{
Class1* myObject = dynamic_cast<Class1*>(mProperty.getClass1());
if(myObject.doClass1Stuff())
{
//The rest of the code
}
return returnValue;
}

在下面的代码中:当调用BaseClass::methodToTest()时,mProperty.getClass1()doClass1Stuff()调用的是实方法,而不是mock方法。


TEST(TestSuite1, TestName1){
MockClass1 * myMockObject1 = new MockClass1;
MockClass2 * myMockObject2 = new MockClass2;
BaseClass * testObject = new BaseClass(myMockClass2Object);
ON_CALL(myMockObject1,doClassic1Stuff()).WillByDefault(Return(true));
ON_CALL(myMockObject2, getClass1()).WillByDefault(Return(myMockObject1));
auto var = testObject.methodToTest();
ASSERT_EQ( 0.0, var);
}

如何使BaseClass调用mock方法?我应该修改源代码来测试它吗?

如果您能提供任何信息,我将不胜感激。谢谢。

您使用mock对BaseClass进行了对象切片,您需要这样的东西:

class Baseclass
{
public: 
Baseclass(std::unique_ptr<Class2> arg) mProperty(std::move(arg)) {}
void doSomething();
void doSomethingElse();
double methodToTest()
{
Class1* myObject = mProperty->getClass1();
if (myObject->doClass1Stuff())
{
//The rest of the code
}
return returnValue;
}
private:
std::unique_ptr<Class2> mProperty;
};

你的测试应该类似于:

TEST(TestSuite1, TestName1){
MockClass1 myMockObject1;
ON_CALL(myMockObject1, doClassic1Stuff()).WillByDefault(Return(true));
auto myMockObject2 = std::make_unique<MockClass2>();
ON_CALL(*myMockObject2, getClass1()).WillByDefault(Return(myMockObject1));
BaseClass testObject(std::move(myMockClass2Object));
// Note: myMockObject2 is nullptr now, as moved, you no longer can use it for ON_CALL
auto var = testObject.methodToTest();
ASSERT_EQ( 0.0, var);
}

最新更新