传递模拟对象作为函数的参数

时间:2018-05-17 18:05:34

标签: c++ unit-testing interface gmock

我正在尝试使用google模拟框架测试一个类,但无法弄清楚如何执行我的测试。

这是我的简化代码:

我在.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());
    };
}

实现mock类:

#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'类型的非const左值引用不能绑定到'MyClasssMock *'类型的临时值

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

我做错了什么? 非常感谢任何帮助!

欢呼声, 西蒙

1 个答案:

答案 0 :(得分:1)

您应该在班级IMyInterface中实施MyClass,如下所示

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);