передача фиктивного объекта в качестве аргумента функции - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь протестировать класс с помощью фреймворка 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());
    };
}

с реализацией макета класса:

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

Это создает семантическую проблему: "Неконстантная lvalue-ссылка на тип 'MyClass' не может привязаться к временному объекту типа 'MyClasssMock *'

Я запутался, потому что думал, что цель MyClassMock - эмулировать MyClass, но это сообщение говорит мне об обратном.

Что я делаю не так? Буду очень признателен за любую помощь!

ура, Simon

1 Ответ

0 голосов
/ 17 мая 2018

Вы должны реализовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...