如何使用GoogleMock设置模拟服务器

时间:2019-01-07 21:15:33

标签: c++ sockets googletest googlemock

我正在将旧的C代码转换为C ++,并在用GoogleTest重写时对其进行测试。我的部分代码使用套接字通过IPV4地址连接到远程主机。在了解如何使用GoogleTest和GoogleMock测试代码的套接字部分时,我遇到了很多麻烦。

我的对象输入了主机IP地址和等待再次尝试连接到主机之前要等待的秒数。实际上有一个名为“ conn()”的函数试图连接到主机。那就是我要测试的功能。因此,在测试中,我想做类似的事情:

TEST(CONNECTION_TEST, Connection) 
{
    MyObject obj("###.###.###.###", 1);
    ASSERT_TRUE(obj.conn());
}

我在这里读到我需要模拟服务器,因为实际上不建议测试远程主机。我是GoogleMock的新手,因此我阅读了官方文档并阅读了GoogleTest primerGoogleMock For DummiesGoogleMock Cheat SheetGoogleMock Cookbook。我看了CodesBay的tutorial。我查看了关于SO的几篇文章,包括What is wrong with my attempts to mock a simple C++ method with googlemock?Patterns for unit testing a C++ method that makes a standard library callHow to unit test BSD sockets

对于我的模拟服务器,我做了以下工作。我制作了一个包装socket.h的Socket类,然后从中扩展了MockSocket。在我的TEST中,我将模拟套接字设置为接受连接,如下所示:

TEST(CONNECTION_TEST, Connection)
{

    // bind to local host?
    MyObject obj("0.0.0.0", 1);

    // create the host
    MockSocket mock_sock;
    MockSocket new_sock;
    EXPECT_CALL(mock_sock, create()).Times(1);
    EXPECT_CALL(mock_sock, bind(_));
    EXPECT_CALL(mock_sock, listen());
    EXPECT_CALL(mock_sock, accept(_));
    mock_sock.create();
    mock_sock.bind(123);
    mock_sock.listen();
    mock_sock.accept(new_sock);

    ASSERT_TRUE(obj.conn());
}

您可以说,我不知道自己在做什么。我的测试结果失败了,我认为这是因为我没有正确执行此操作。拜托,有人可以指引我正确的方向吗?模拟服务器是测试我的对象的正确方法吗?

1 个答案:

答案 0 :(得分:1)

您要测试什么?

您是否要测试TCP / IP套接字类(假设有一个)是否可以实际连接某些TCP / IP服务并与之通信?这更是一个端到端的测试。您可以使用Google Test来执行此操作,但需要运行的TCP / IP服务进行通信。这不是Google模拟框架的用途。这类似于您要测试读取文件的类时:您需要拥有一个可以读取的文件,而Google模拟框架在这里无法为您提供帮助。

您是否要测试其他使用TCP / IP套接字类的类是否工作?在这里,您可以使用Google模拟框架为套接字类创建模拟。该模拟将充当您其他类的套接字类,但不会进行任何TCP / IP通信。这样,您就可以对其他课程进行单元测试。