Что не так с моими попытками издеваться над простым методом C ++ с помощью googlemock? - PullRequest
0 голосов
/ 25 апреля 2011

Согласно Шаблонам для модульного тестирования метода C ++, который выполняет стандартный вызов библиотеки , я тестирую разработку класса сетевого абстрагирования.Чтобы выполнить модульное тестирование кода, который делает стандартные вызовы библиотеки C (которые я не могу имитировать) для обработки сокетов BSD, я определил интерфейс ISocket, от которого наследуются моя реальная реализация CSocket и mock MockSocket.

Теперь я пишу свой первый модульный тест для класса Network, в котором для тяжелой работы используется ISocket:

#include "gmock/gmock.h"
#include "gtest/gtest.h"
// C standard library includes omitted
#include "MockSocket.h"
#include "Network.h"

using ::testing::Return;
namespace JrStream {
  class NetworkTest : public ::testing::Test {
  protected:
    Network net;
    ISocket * socket_ptr;

    virtual void SetUp() {
      socket_ptr = new MockSocket();
    }
  };

  TEST_F(NetworkTest, InitCallsSocket) {
    EXPECT_CALL((MockSocket)*socket_ptr, Socket(AF_INET, SOCK_STREAM, 0))
        .Times(1)
        .WillOnce(Return(5)); //fake file descriptor

    ASSERT_TRUE(net.init(socket_ptr));
  }
} // namespace
// gtest boilerplate main() omitted

Но я получаю эту ошибку при компиляции:

g++ -g -Wall -Lgtest-1.5.0/lib -Igmock-1.5.0/include -Igtest-1.5.0/include -I.. -I../../Debug/src -c -o NetworkTest.o NetworkTest.cc
NetworkTest.cc: In member function ‘virtual void JrStream::NetworkTest_InitCallsSocket_Test::TestBody()’:
NetworkTest.cc:35: error: no matching function for call to ‘JrStream::MockSocket::MockSocket(JrStream::ISocket&)’
MockSocket.h:16: note: candidates are: JrStream::MockSocket::MockSocket()
MockSocket.h:16: note:                 JrStream::MockSocket::MockSocket(const JrStream::MockSocket&)

А вот как выглядит мой интерфейс и макет:

namespace JrStream {
  class ISocket {
    virtual int Socket(int domain, int type, int protocol) = 0;
  };
}

#include "gmock/gmock.h"
#include "ISocket.h"
namespace JrStream {
  class MockSocket: public JrStream::ISocket {
    MOCK_METHOD3(Socket, int(int domain, int type, int protocol));
  };
}

Есть идеи, что я здесь не так делаю?

Ответы [ 3 ]

3 голосов
/ 25 апреля 2011

Похоже, вы вызываете конструктор копирования для MockSocket где-то в TestBody без приведения.

1 голос
/ 26 апреля 2011

Я наконец-то разобрался. Меня сбило с толку то, что я хотел использовать указатель, но googlemock работает с классами. Вот что работает:

#include "gmock/gmock.h"
#include "gtest/gtest.h"
// C standard library includes omitted
#include "MockSocket.h"
#include "Network.h"

using ::testing::Return;
namespace JrStream {
  class NetworkTest : public ::testing::Test {
  protected:
    Network net;
    MockSocket sock;
  };

  TEST_F(NetworkTest, InitCallsSocket) {
    EXPECT_CALL(sock, Socket(AF_INET, SOCK_STREAM, 0))
        .Times(1)
        .WillOnce(Return(5)); //fake file descriptor

    ASSERT_TRUE(net.init(&sock));
  }
} // namespace
// gtest boilerplate main() omitted

Это хорошо, но мне интересно, как заставить это работать, если мне действительно нужны мои указатели. Похоже, упражнение для читателя. ;)

0 голосов
/ 30 мая 2011

Как насчет:

TEST_F(NetworkTest, InitCallsSocket) {
EXPECT_CALL(*((MockSocket)*socket_ptr), Socket(AF_INET, SOCK_STREAM, 0))
    .Times(1)
    .WillOnce(Return(5)); //fake file descriptor

ASSERT_TRUE(net.init(socket_ptr));

}

(Отказ от ответственности - я не проверял, компилируется ли он ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...