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

How to set up a mock server with GoogleMock

本文关键字:模拟 服务器 设置 GoogleMock 何使用      更新时间:2023-10-16

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

我的对象需要一个主机IP地址和等待的秒数,然后再尝试连接到主机。有一个名为"conn()"的函数,它实际上试图连接到主机。这就是我想要测试的功能。所以在我的测试中,我想做一些类似的事情:

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

我在这里读到,我需要模拟服务器,因为测试远程主机实际上并不可取。我是GoogleMock的新手,所以我阅读了官方文档,阅读了GoogleTest入门书、GoogleMock For Dummies、GoogleMockCheat Sheet和GoogleMock Cookbook。我看了CodesBay的教程。我看了SO上的几篇帖子,包括我试图用谷歌模拟一个简单的C++方法有什么问题?,进行标准库调用的C++方法的单元测试模式,以及如何对BSD套接字进行单元测试。

对于我的模拟服务器,我做了以下操作。我制作了一个封装Socket.h的Socket类,然后从中扩展了MockSocket

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

正如你所知,我不知道自己在做什么。我的测试结果失败了,我想这是因为我做得不对。拜托,有人能指引我朝正确的方向走吗?模拟服务器是测试我的对象的正确方法吗?

您想要测试什么?

你想测试TCP/IP套接字类(假设有一个)是否真的可以与一些TCP/IP服务连接和通信吗?这更像是一个端到端的测试。你可以使用谷歌测试来实现这一点,但你需要一个运行的TCP/IP服务来进行通信。这不是谷歌嘲讽框架的用武之地。这类似于当你想测试一个读取文件的类时:你需要一个它可以读取的文件,而谷歌嘲讽框架在这里对你没有帮助。

您想测试使用您的TCP/IP套接字类的其他类是否工作吗?在这里,您可以使用Google mocking框架为您的套接字类创建mock。这个mock将充当其他类的套接字类,但不会进行任何TCP/IP通信。通过这种方式,您可以对其他类进行单元测试。