【问题标题】:passing a mock object as an argument of a function将模拟对象作为函数的参数传递
【发布时间】:2018-05-17 18:05:34
【问题描述】:

我正在尝试使用 google mock 框架测试一个类,但不知道如何执行我的测试。

这是我的简化代码:

我在 .h 文件中有一个接口:

namespace Mynamespace
{    
    class IMyInterface
    {
    public:
        virtual ~ IMyInterface() {};

        virtual int myFunction() = 0;

    };
}

还有我继承自接口的模拟类:

#include <gmock/gmock.h>
#include <IMyInterface.h>

namespace testing
{
    class MyClassMock : public IMyInterface
    {
    public:
        ~ MyClassMock();
        MyClassMock();

        MOCK_METHOD0(myFunction, int());
    };
}

与模拟类的实现:

#include "MyClassMock.h"
namespace testing
{
    MyClassMock:: MyClassMock()
    {
    }

    MyClassMock::~ MyClassMock()
    {
    }
}

我的另一个类将 MyClass 的对象作为函数的参数,如下所示:

#include "MyClass.h"

namespace Mynamespace
{
    class AnotherClass
    {
    public:
        AnotherClass();
        ~ AnotherClass();

        void anotherFunction(MyClass&);
    };
}

与实施:

#include MyClass.h
#include AnotherClass.h

namespace Mynamespace
{
    AnotherClass:: AnotherClass()
    {
    }
    AnotherClass::~ AnotherClass()
    {
    }
    AnotherClass::anotherFunction(MyClass& obj_myClass)
    {
        //does something...
    }
}

然后我想使用这样的模拟来测试 AnotherClass 的功能:

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "MyClass.h"
#include "MyClassMock.h"
#include "AnotherClass.h"

using namespace testing;
using namespace std;

    TEST(DirectivityParameter, CanInstantiate)
    {
        AnotherClass obj_anotherClass;
        MyClassMock mock_myClass;

        EXPECT_CALL(mock_myClass, myFunction())
            .Times(1)
            .WillOnce(Return(0));

        obj_anotherClass.anotherFunction(&mock_myClass);
    }

这会产生语义问题: “对‘MyClass’类型的非常量左值引用不能绑定到‘MyClasssMock *’类型的临时对象

我很困惑,因为我认为 MyClassMock 的目的是模仿 MyClass,但这条消息告诉我并非如此。

我做错了什么? 任何帮助将不胜感激!

干杯, 西蒙

【问题讨论】:

    标签: c++ unit-testing interface gmock


    【解决方案1】:

    你应该在你的班级MyClass 中实现IMyInterface,如下所示

    class MyClass :IMyInterface
    {
         public:
           virtual int myFunction(); 
    }
    

    并且您应该将IMyInterface 传递给您的AnotherClass 函数语法如下所示:

    class AnotherClass
    {
    public:
        AnotherClass();
        ~ AnotherClass();
    
        void anotherFunction(IMyInterface *);
    };
    

    然后您可以使用您的测试代码测试您的 AnotherClass

        AnotherClass obj_anotherClass;
        MyClassMock mock_myClass;
    
        EXPECT_CALL(mock_myClass, myFunction())
            .Times(1)
            .WillOnce(Return(0));
    
        obj_anotherClass.anotherFunction(&mock_myClass);
    

    【讨论】:

    • 感谢 Maddy,这成功了,当 Mock 从它继承并且我想传递它的对象时,我应该传递接口似乎是合理的。干杯,
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2018-02-23
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多